0

c# linq の動的 where 句に関する投稿があったことは知っていますが、linq には少し慣れていないため、提案されたソリューションが私のケースに関連しているとは思いません。

問題は次のとおりですDictionary<string, List<string>>。ディクショナリ内の各値は、一連の値を表します。例: 特定のキー「food」の場合、値は {"apple", "tomato", "soup"} になります。さらに、DataTableその列が辞書のキーである があります。

私の使命は、辞書に従って where 節が作成される linq を作成することです。このように、複数の値の間では「or」条件が現れ、キーの値の間では「And」または「Or」条件が現れます。

辞書で見つかったキーに応じて動的に変更する必要があるため、ハードコーディングすることはできません。

私の要件に一致する複数の where 句を連結する方法がよくわかりません。

4

2 に答える 2

0

linq 式を連結する代わりに、.Any()、.All()、.Contains() を使用して目的を達成できます。

var filters = new Dictionary<string, List<string>> { {"Food",  new List<string> { "apple", "tomato", "soup"} },
                                                     {"Drink", new List<string> { "tea"                    }}};

var table = new System.Data.DataTable();

table.Columns.Add("Food");table.Columns.Add("Drink");

table.Rows.Add("apple" , "water");
table.Rows.Add("tomato", "tea");
table.Rows.Add("cake"  , "water");
table.Rows.Add("cake"  , "tea");

//And: Retrieves only tomato, tea
var andLinq = table.Rows.Cast<System.Data.DataRow>().Where(row => filters.All(filter => filter.Value.Contains(row[filter.Key])));
//Or: Retrieves all except cake, water
var orLinq = table.Rows.Cast<System.Data.DataRow>().Where(row => filters.Any(filter => filter.Value.Contains(row[filter.Key])));

Contains は equals val1 または equals val2 と同等です。

于 2013-07-22T14:46:31.407 に答える
0

答えを更新しました。それは私があなたの質問から引き出すことができる最も正確なものです.

Dictionary<string, List<string>> filters = GetFilters();
var filteredSource = GetSource();            
bool useAndOperator = GetUseAndOperator();

foreach (var filter in filters.Values)
{
    Func<myDataRow, bool> predecate = useAndOperator ? s => filter.All(f => f == s["key1"])
                                                     : s => filter.Any(f => f == s["key1"]);

    filteredSource = filteredSource.Where(predecate);
}

また、このコードはあまり意味がありませんが、完全なソリューションではなく原則を示しているため、必要に応じて更新する必要があります。

于 2013-07-22T12:54:00.503 に答える