0

我有这样的功能

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)。

4

2 回答 2

3

如果您只是想匹配第一个字母,请尝试:

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))
             );
于 2013-01-21T22:56:12.017 回答
0

也许你应该看看predicate builder

然后像

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 存储的单个查询。

更新:它也可以在没有谓词构建器的情况下完成,但我发现在没有它的情况下使用表达式树真的很乏味。

于 2013-01-21T23:07:04.903 回答