2

文字列のリストを受け取り、一致するすべての項目のリストを返す関数を作成する必要があります(つまり、SQL "LIKE"、大文字と小文字を区別せず、発音区別符号を無視します)。

// Pseudocode example
IEnumerable<Item> Search(List<String> patterns)
{
    var result = new List<Item>();

    foreach (var Item in context.Items)
    {
        bool matches = true;

        foreach (var pattern in patterns)
        {
            if (!Item.Name.Contains(pattern))
            {
                matches = false;
                break;
            }
        }

        if (matches)
        {
            result.Add(Item);
        }
    }

    return result;
}

これに似たものは機能しますが、理想的とは言えません(ひどく非効率的なようです)。

次のSQLに似たものを生成する(おそらくLINQ)クエリを作成することは可能ですか?:

SELECT *
FROM items
WHERE items.name LIKE :pattern1
  AND items.name LIKE :pattern2
  ...
  AND items.name LIKE :patternN
4

1 に答える 1

3

WHEREパターンを反復して、それぞれに句を適用するだけです。

var patterns = new List<string>();
using (var context = new MyDataContext())
{
    var query = (IQueryable<Area>)context.Areas;

    foreach (var pattern in patterns)
    {
        query = query.Where(a => a.Description.Contains(pattern));
    }

    return query.ToList();
}

ご存じのとおり、クエリは遅延実行されます。この場合、ToListすべてのパターンが適用された後、呼び出しが実行されるまで実行されません。

于 2012-08-01T02:04:28.697 に答える