如何在.Where()子句中使这个小于或等于工作?我收到了一个错误。
var filteredProducts = Products.Where(p => p.State.Contains("Bruikbaar"))
.Where(p => p.Privilege <= ui.GetPrivilegeNumber())
.ToList();
错误:
LINQ to Entities无法识别方法'Int32 GetPrivilegeNumber()'方法,并且此方法无法转换为商店表达式。
我希望以前从未问过这个问题。谷歌搜索也找不到它或者我用错误的词来表达我的问题。
答案 0 :(得分:4)
ui.GetPrivilegeNumber()
不是公认的方法。
使用此:
var uiPrivilege = ui.GetPrivilegeNumber();
var filteredProducts = Products.Where(p => p.State.Contains("Bruikbaar"))
.Where(p => p.Privilege <= uiPrivilege)
.ToList();
正如其他用户提到的那样,您可以优化Where
。
答案 1 :(得分:3)
EF不执行您在谓词中使用的方法调用。它将它们存储为表达式(即语法树),然后通过将C#代码转换为SQL代码来分析此树以构建SQL查询。它无法将GetPrivilegeNumber()
方法调用转换为SQL,因为没有适当的SQL代码。所以你只需要将这个方法调用移出表达式,而只传递方法调用的结果:
var privilegeNumber = ui.GetPrivilegeNumber();
var filteredProducts = Products.Where(p => p.State.Contains("Bruikbaar"))
.Where(p => p.Privilege <= privilegeNumber)
.ToList();
现在privilegeNumber
只是一个整数变量,它被翻译成SQL参数
SELECT * FROM Products p
WHERE p.State LIKE '%Bruikbaar%' AND p.Privilege <= @privilegeNumber
答案 2 :(得分:2)
您需要在查询之外移动ui.GetPrivilegeNumber()
。您还可以将这些Where
个查询合并为一个查询:
var privilegeNumber = ui.GetPrivilegeNumber();
var filteredProducts = Products.Where(p =>
p.State.Contains("Bruikbaar")
&& p => p.Privilege <= privilegeNumber)
.ToList();
答案 3 :(得分:0)
您可以在LinQ中使用其他评估方法。为了简化代码,你可以用很简单的方式编写LinQ。
var uiPrivilege = ui.GetPrivilegeNumber();
var filteredProducts =(from p in Products
where p.State.Contains("Bruikbaar") && p.Privilege <= uiPrivilege
select p).ToList();
上述查询生成相同的输出但很容易理解。