0

だから私はこの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) );

フィルター

順不同の名前と姓を含む文字列リストです (完全である必要はありません)。例: {Mary, Joseph Ken} をフィルタしますが、DB {Mary Katie, Joseph Kendall} をフィルタします。

予想された結果

前のフィルターの場合、フィルター内の名前と姓が不完全で正しいかどうかに関係なく、クエリがユーザーのリストを返すようにします。そのため、フィルターに「Mary」が含まれている場合、「Mary Katie」などを含むデータベース レコードが検出される必要があります。

4

3 に答える 3

3

あなたが望むものはフィルターが与えられていると思います

Bob
Alice
Jane

およびクエリ内のアイテム

Bob Nob
Alice Howzer
Jane Bob
Tim

あなたは得るだろう

Bob Nob
Alice Howzer
Jane Bob

フィルターが名前または姓の一部と一致したためですよね?

コレクションに次のような拡張メソッドを追加してみませんか

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();
}

明らかに、これは簡単で汚い方法であり、それを行うためのよりクリーンな方法がありますが、少なくとも今はロジックをカプセル化しています。

于 2012-04-05T22:00:06.217 に答える
2

String.ContainsDB から余分なデータをフェッチせずに、とを組み合わせAnyて linq2entity の問題を解決できます。

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)));
于 2012-04-05T22:04:25.290 に答える
0

多分これらの線に沿った何か?私は実際にそれをテストしていないので、バイヤーは注意してください.

public static bool IsIn(this string value, IEnumerable<string> compareList)
{
   foreach (string compareValue in compareList)
   {
        if (value.Contains(compareValue))
                return true;
   }
        return false;
}
于 2012-04-05T22:27:23.860 に答える