2

IDに従ってドメインを返すビューを使用しています。Domains 列は、'Geography' にすることも、詰め込んだドメイン 'Geography,History' にすることもできます。(いずれにせよ、返されるデータは VARCHAR です)

私の C# コードには、メイン ドメインを含むリストがあります。

private static List<string> _mainDomains = new List<string>()
{
    "Geography",
    "Mathematics",
    "English"
};

1 つまたは複数のメイン ドメインに関連するデータのみを返すために、 LINQクエリをフィルター処理したいと考えています。

expression = i => _mainDomains.Any(s => i.Domains.Contains(s));
var results = (from v_lq in context.my_view
                select v_lq).Where(expression)

問題は、SQL で使用できないためAny、キーワードもキーワードも使用できないことです。Existsキーワードを使用して多くのソリューションを見てきましContainsたが、それは私の問題には合いません。

私は何をすべきか?

4

2 に答える 2

3

次の内容を使用できます。

where i.Domains.Any(s => _mainDomains.Contains<string>(s.xxx))

一般的な引数が必要であることに注意してください (たとえ Resharper がそうでないと言うかもしれませんが)。Enumerable.Containsではなく、を選択する必要がありますList.Contains。後者は翻訳できません (これは L2S 製品設計のエラーと考えられます)。

(あなたのデータ モデルにぴったりのクエリを取得できなかった可能性があります。必要に応じて調整してください)。

于 2012-09-07T20:15:52.830 に答える
0

私はそれを考え出した。キーワードを使用できないため、次のAny関数を使用しました。

    public static bool ContainsAny(this string databaseString, List<string> stringList)
    {
        if (databaseString == null)
        {
            return false;
        }
        foreach (string s in stringList)
        {
            if (databaseString.Contains(s))
            {
                return true;
            }
        }
        return false;
    }

Whereしたがって、次の式を節で使用できます。

expression = i => i.Domains.ContainsAny(_mainDomains);

更新: usr によると、クエリはすべての値を返し、where 句のサーバー側を実行します。より良い解決策は、別のアプローチを使用することです (詰め物/カンマ区切りの値を使用しないでください)。

于 2012-09-07T20:46:53.303 に答える