小于的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()"方法,并且此方法无法转换为存储表达式。

我希望这个问题以前从未被问过。谷歌也找不到,或者我用错了词来表达我的问题。

小于的ASP.NET实体框架.Where()

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();

上面的查询生成相同的输出,但易于理解。