Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Linq动态where语句结合数据表和给定字典_C#_.net_Linq - Fatal编程技术网

C#Linq动态where语句结合数据表和给定字典

C#Linq动态where语句结合数据表和给定字典,c#,.net,linq,C#,.net,Linq,我知道在c#linq中有关于动态where子句的帖子,但是,我对linq有点陌生,不认为提出的解决方案与我的案例相关 问题如下: 我有一本字典。字典中的每个值表示一组值。例如:对于给定的键“food”,值可以是{“apple”、“tomato”、“soup”}。此外,我还有一个DataTable,它的列是字典的键 我的任务是构建一个linq,其中where子句是根据字典构建的。 因此,在多个值之间将出现“或”条件,在键的值之间将出现“或”或“条件” 我不能把它硬编码,因为它必须根据字典中找到的键

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

问题如下: 我有一本
字典
。字典中的每个值表示一组值。例如:对于给定的键“food”,值可以是{“apple”、“tomato”、“soup”}。此外,我还有一个
DataTable
,它的列是字典的键

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

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


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

我更新了答案。这是我能从你的问题中得出的最准确的结论

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);
}
Dictionary filters=GetFilters();
var filteredSource=GetSource();
bool useAndOperator=GetUseAndOperator();
foreach(filters.Values中的var过滤器)
{
Func predecate=useAndOperator?s=>filter.All(f=>f==s[“key1”])
:s=>filter.Any(f=>f==s[“key1”]);
filteredSource=filteredSource.Where(预Decate);
}

此外,这段代码没有多大意义,但它演示了原理,而不是完整的解决方案,您应该根据需要对其进行相应的更新。

而不是使用.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])));
var filters=新字典{{“食品”,新列表{“苹果”,“番茄”,“汤”},
{“饮料”,新名单{“茶”}};
var table=new System.Data.DataTable();
表.列.添加(“食品”);表.列.添加(“饮料”);
表。行。添加(“苹果”、“水”);
表。行。添加(“番茄”、“茶”);
表。行。添加(“蛋糕”、“水”);
表。行。添加(“蛋糕”、“茶”);
//还有:番茄,茶
var和linq=table.Rows.Cast().Where(row=>filters.All(filter=>filter.Value.Contains(row[filter.Key]));
//或:检索除蛋糕、水以外的所有内容
var orLinq=table.Rows.Cast().Where(row=>filters.Any(filter=>filter.Value.Contains(row[filter.Key]));

Contains相当于equals val1或equals val2。

不确定您的问题是什么。是否有您想要的伪代码?显示您的现有代码可能有助于其他人引导您朝着正确的方向找到有效的解决方案。例如,我想在linq中添加where子句,例如:where(myDataTable[key1]。equals(val1)或myDataTable[key1].equals(val2)和(myDataTable[key2].equals(val3)…等等。谢谢你的回答。但是,这不是我的意思。字典可以有许多保存值的键。我必须遍历它并放大我的where子句。此外,我还有一个枚举,说明我在键之间使用“或”或“and”。对于给定的键,在其多个值中使用“或”。硬编码值不是选项。它必须是泛型的。谢谢!我会检查它