0

我知道在 c# linq 中有关于动态 where 子句的帖子,但是,我对 linq 有点陌生,并且不认为提出的解决方案与我的案例相关。

问题如下:我有一个Dictionary<string, List<string>>. 字典中的每个值代表一组值。例如:对于给定的键“food”,其值可以是{“apple”、“tomato”、“soup”}。另外,我有一个DataTable它的列是字典的键。

我的任务是构建一个 linq,它的 where 子句是根据字典构建的。因此,在多个值之间,将出现“或”条件,而在键的值之间,将出现“与”或“或”条件。

我不能硬编码,因为它必须根据字典中的键动态变化。

我真的不知道如何连接多个可能符合我要求的 where 子句。

4

2 回答 2

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 回答
0

您可以使用 .Any()、.All() 和 .Contains() 来实现您想要的,而不是连接 linq 表达式。

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 等价于等于 val1 或等于 val2。

于 2013-07-22T14:46:31.407 回答