我有一個場景使用下面的代碼來簡化這里的解釋。我有一個模型類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 }, };我想使用通用PredicateBuilder 中引入的PredicateBuilder來構(gòu)建動態(tài)查詢。以下代碼只是我嘗試的第一步。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();我需要一些幫助來理解為什么謂詞 inWhere對我不起作用?
1 回答

元芳怎么了
TA貢獻(xiàn)1798條經(jīng)驗 獲得超7個贊
問題出在這一行:
predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
將其更改為:
predicate = predicate.Or(x => !allLevel1CodesInConfig.Contains(x.CodeLevel1) && x.IsVoluntary == false);
每種PredicateBuilder
方法都會創(chuàng)建一個新的謂詞,并且不會改變原始謂詞。
- 1 回答
- 0 關(guān)注
- 234 瀏覽
添加回答
舉報
0/150
提交
取消