2012-04-05 6 views
0

です。このlinqクエリ節があります。LINQを模倣するクエリは

var ctx = new Context(); 
IQueryable<Users> consulta = ctx.Users; 

if (filters.Count > 0) 
    query = query.Where(p => filters.Contains(p.Name) || 
          filters.Contains(p.LastName)); 

フィルタ

順不同名前とlastnames(不要の完全な)を含む文字列のリストです。例:Filter {Mary、Joseph Ken}だがDB {Mary Katie、Joseph Kendall}。私はその名前とlastnamesが不完全なく、正しいフィルター内の場合、クエリは、ユーザーのリストに関係なくを返したい以前のフィルタの場合

期待される結果

。フィルタに「Mary」がある場合は、「Mary Katie」などのデータベースレコードを検出する必要があります。

+6

あなたの質問は未完了です。詳細を知らずに自分の質問を理解してください。例えば ​​'query'と' filters'は何ですか?サンプルデータと必要な結果を提供する。 –

+0

これがlinq2entityの場合、それぞれタグを付けます。 –

+0

@SaeedAmiriはエンティティコードファーストです。 –

答えて

2

あなたは、DBから余分なデータをフェッチすることなく、linq2entityであなたの問題を解決するためにString.ContainsAnyのミックスを使用することができます。

var ctx = new Context(); 
IQueryable<Users> consulta = ctx.Users; 

if (filters.Count > 0) 
    query = query.Where(p => filters.Any(x=>x.Contains(p.Name)) || 
          filters.Any(x=>x.Contains(p.LastName)) || 
          filters.Any(x=>p.Name.Contains(x)) || 
          filters.Any(x=>p.LastName.Contains(x))); 
+0

これはうまくいかないようです。結果セットは再び同じです。フィルターが "Bob"ではなく "Bob Knob"である場合、 "Bob Knob"という名前のユーザーしか見つかりませんでした。 –

+0

OK編集します。 –

+0

@RandolfRincón-Fadul私の編集を参照してください。これはうまくいくはずです。余分な 'Any'コールを削除することができます。実際には正確なDBとフィルタフォーマットがわかりません。しかし、パフォーマンスに大きな影響はありません。 –

3

は、私はあなたがフィルタがどの部分に一致したので、あなたが

Bob Nob 
Alice Howzer 
Jane Bob 

になるだろうなど

Bob Nob 
Alice Howzer 
Jane Bob 
Tim 

フィルタ

Bob 
Alice 
Jane 

やアイテム、クエリ内に与えられて何をしたいと思います最初の、または最後の名前の権利?

はなぜここ

public static bool IsInAny(this IEnumerable<String> source, string name, string delim = " ") 
{ 
    return source.Any(item => 
          { 
          var splits = name.Split(new[] { delim }, StringSplitOptions.RemoveEmptyEntries); 
          return splits.Contains(item); 
          }); 
} 

のようなものは、あなたが、それは明らかに、これは単なる迅速かつ汚い方法です

[Test] 
public void TestInAny() 
{ 
    var filters = new[] {"Bob", "Alice"}; 
    var items = new[] {"Bob Knob", "Alice Jane", "Tim"}; 

    var found = items.Where(i => filters.IsInAny(i)).ToList(); 
} 

テストに使用できるテストですし、あなたのコレクションに拡張メソッドを追加しませんより洗練された方法がありますが、少なくとも今はロジックをカプセル化しています。

+1

これはlinq2entityでは動作しません.LINQ2entityでOPが動作するようです。 –

+0

Devshorts、あなたの助けに感謝しますが、@SaeedAmiriが正しいようです。 LINQ to Entitiesは、メソッドのBoolean IsInAny(System.Collections.Generic.IEnumerable'1 [System.String]、System.String、System.String) 'メソッドを認識しません。 –

0

たぶん、これらの線に沿って何かを?私は実際にバイヤーが注意するようにそれをテストしていない。

public static bool IsIn(this string value, IEnumerable<string> compareList) 
{ 
    foreach (string compareValue in compareList) 
    { 
     if (value.Contains(compareValue)) 
       return true; 
    } 
     return false; 
} 
+0

これはlinq2entityでは悪いことですが、実際にはすべてのデータを取得する必要があります。これは悪魔です。 –

+1

LinqToEntityのコンテキスト内にあったことに気付かなかった。私の悪い。拡張メソッドは、SQLステートメントに変換可能でなければなりません。 – richk