LINQ to object 和通用 PredicateBuilder 似乎不能很好地协同工作
LINQ to object and universal PredicateBuilder does not seem to play well together
我有一个场景可以使用下面的代码来简化这里的解释。
我有模型class
class Model
{
public string CodeLevel1 { get; set; }
public string CodeLevel2 { get; set; }
public bool IsVoluntary { get; set; }
}
很明显我会建立一个对象列表
var models = new List<Model>
{
new Model()
{
CodeLevel1 = "32",
CodeLevel2 = "A1",
IsVoluntary = false
},
new Model()
{
CodeLevel1 = "32",
CodeLevel2 = "A2",
IsVoluntary = true
},
new Model()
{
CodeLevel1 = "33",
CodeLevel2 = "A3",
IsVoluntary = true
},
new Model()
{
CodeLevel1 = "34",
CodeLevel2 = "A4",
IsVoluntary = false
},
new Model()
{
CodeLevel1 = "34",
CodeLevel2 = "A5",
IsVoluntary = false
},
new Model()
{
CodeLevel1 = "34",
CodeLevel2 = "A6",
IsVoluntary = true
},
};
我想使用 A universal PredicateBuilder 中介绍的 PredicateBuilder 来构建动态查询。以下代码只是我尝试的第一步。
var configs = new Dictionary<string, List<string>>()
{
{ "32", new List<string>() { "A1", "A2"} },
{ "33", new List<string>() { "A3" } },
};
var predicate = PredicateBuilder.False<Model>();
var allLevel1CodesInConfig = (from c in configs select c.Key).ToList();
predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
var filteredList = models.AsQueryable().Where(predicate).ToList();
我在 filteredList
中什么也没得到,但如果我重写最后一行代码,我就会得到我所期望的。
var filteredList = models.AsQueryable().Where(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false).ToList();
我需要一些帮助来理解为什么 Where
中的谓词对我不起作用?
问题出在这一行:
predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
改为:
predicate = predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
每个 PredicateBuilder
方法都会创建一个新谓词并且不会改变原始谓词。
我有一个场景可以使用下面的代码来简化这里的解释。
我有模型class
class Model
{
public string CodeLevel1 { get; set; }
public string CodeLevel2 { get; set; }
public bool IsVoluntary { get; set; }
}
很明显我会建立一个对象列表
var models = new List<Model>
{
new Model()
{
CodeLevel1 = "32",
CodeLevel2 = "A1",
IsVoluntary = false
},
new Model()
{
CodeLevel1 = "32",
CodeLevel2 = "A2",
IsVoluntary = true
},
new Model()
{
CodeLevel1 = "33",
CodeLevel2 = "A3",
IsVoluntary = true
},
new Model()
{
CodeLevel1 = "34",
CodeLevel2 = "A4",
IsVoluntary = false
},
new Model()
{
CodeLevel1 = "34",
CodeLevel2 = "A5",
IsVoluntary = false
},
new Model()
{
CodeLevel1 = "34",
CodeLevel2 = "A6",
IsVoluntary = true
},
};
我想使用 A universal PredicateBuilder 中介绍的 PredicateBuilder 来构建动态查询。以下代码只是我尝试的第一步。
var configs = new Dictionary<string, List<string>>()
{
{ "32", new List<string>() { "A1", "A2"} },
{ "33", new List<string>() { "A3" } },
};
var predicate = PredicateBuilder.False<Model>();
var allLevel1CodesInConfig = (from c in configs select c.Key).ToList();
predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
var filteredList = models.AsQueryable().Where(predicate).ToList();
我在 filteredList
中什么也没得到,但如果我重写最后一行代码,我就会得到我所期望的。
var filteredList = models.AsQueryable().Where(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false).ToList();
我需要一些帮助来理解为什么 Where
中的谓词对我不起作用?
问题出在这一行:
predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
改为:
predicate = predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
每个 PredicateBuilder
方法都会创建一个新谓词并且不会改变原始谓词。