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 に答える