我有一个这样的函数
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存储的单个查询。
更新:它也可以没有谓词构建器,但我发现没有它的表达式树工作是非常繁琐的。