小于的ASP.NET实体框架.Where()
本文关键字:Where 框架 实体 ASP NET 小于 | 更新日期: 2023-09-27 18:23:35
如何在.Where()子句中使其小于或等于?我犯了一个错误。
var filteredProducts = Products.Where(p => p.State.Contains("Bruikbaar"))
.Where(p => p.Privilege <= ui.GetPrivilegeNumber())
.ToList();
错误:
LINQ to Entities无法识别方法"Int32 GetPrivilegeNumber()"方法,并且此方法无法转换为存储表达式。
我希望这个问题以前从未被问过。谷歌也找不到,或者我用错了词来表达我的问题。
ui.GetPrivilegeNumber()
不是可识别的方法。
使用此:
var uiPrivilege = ui.GetPrivilegeNumber();
var filteredProducts = Products.Where(p => p.State.Contains("Bruikbaar"))
.Where(p => p.Privilege <= uiPrivilege)
.ToList();
正如其他用户所提到的,您可以优化您的Where
。
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
您需要将ui.GetPrivilegeNumber()
移出查询。您还可以将这些Where
查询合并为一个查询:
var privilegeNumber = ui.GetPrivilegeNumber();
var filteredProducts = Products.Where(p =>
p.State.Contains("Bruikbaar")
&& p => p.Privilege <= privilegeNumber)
.ToList();
您可以在LinQ中使用其他评估方法。为了简化代码,您可以用LinQ的老方法来使用它。
var uiPrivilege = ui.GetPrivilegeNumber();
var filteredProducts =(from p in Products
where p.State.Contains("Bruikbaar") && p.Privilege <= uiPrivilege
select p).ToList();
上面的查询生成相同的输出,但易于理解。