从over一个数组开始



我有一个这样的函数

public List<Entry> GetEntriesForSlider(int first, int max, List<string> NameLetters)
{
    //Some code
}

在这段代码中,我想在数据库中搜索,返回名字以NameLetters中字母开头的所有结果。

如果我传入数组NameLetters = ["a","b","c"]

那么它将返回如下结果:

Amy 
Bert 
Aaron 
Chris

应该注意的是,我理想地希望使用某种linq语句,如…

entries.Where(x => x.FirstName.StartsWith(partofArray));

如果可能的话。

编辑:我之前有以下内容:

var entries = _repository.All<Entry>().Skip(first).Take(max);
if (NameLetters != null && NameLetters.Count > 0)
    entries = entries.Where(x => NameLetters.Contains(x.FirstName[0].ToString()));

但是我发现的是,它在运行where语句之前枚举了查询(我认为)。可能是因为试图访问firstname的第一个字母(或ToString)。

如果你只是想匹配第一个字母,试试:

entries.Where(x => partofArray.Contains(x.FirstName[0]));

如果您需要担心null或空字符串,则更安全的版本是:

entries.Where(x => 
                  !string.IsNullOrEmpty(x.FirstName) &&
                  partofArray.Contains(x.FirstName[0])
             );

如果您想使用可变长度字符串,请尝试:

entries.Where(x => 
                   partofArray.Any( p=> x.FirstName.StartsWith(p))
             );

也许您应该看看谓词构建器。

然后是

IQueryable<Entry> GetThingsThatBeginWithA(String[] prefixes)
{
    var predicate = PredicateBuilder.False<Entry>();
    foreach (String prefix in prefixes)
        predicate = predicate.Or(p => p.FirstName.StartsWith(prefix));
    return database.Entries.Where(predicate);
}

这个查询应该正确地编译为对SQL存储的单个查询。

更新:它也可以没有谓词构建器,但我发现没有它的表达式树工作是非常繁琐的。

相关内容

  • 没有找到相关文章

最新更新