我知道在c#linq中有关于动态where子句的帖子,但是,我对linq有点新,并且不认为所提出的解决方案与我的案例相关。
问题如下:
我有Dictionary<string, List<string>>
。字典中的每个值代表一组值。例如:对于给定的键“食物”,值可以是{“apple”,“tomato”,“soup”}。另外,我有一个DataTable
,其列是字典的键。
我的任务是来构建一个linq,其where子句是根据字典构建的。 因此,在多个值中,将出现“或”条件,并且在键值之间,将显示“和”或“或”条件。
我无法将其编写为硬编码,因为它必须根据字典中的键动态更改。
我真的不知道如何连接多个可能符合我要求的where子句。
答案 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。