C#Linq动态where语句组合DataTable和给定的Dictionary

时间:2013-07-22 12:46:42

标签: c# .net linq

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

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

我的任务是来构建一个linq,其where子句是根据字典构建的。 因此,在多个值中,将出现“或”条件,并且在键值之间,将显示“和”或“或”条件。

我无法将其编写为硬编码,因为它必须根据字典中的键动态更改。

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

2 个答案:

答案 0 :(得分: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);
}

此代码也没有多大意义,但它表明原则不是完整的解决方案,您应该根据您的需要进行更新。

答案 1 :(得分: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等于val1或等于val2。