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

时间:2015-11-19 10:16:55

标签: c# asp.net entity-framework

如何在.Where()子句中使这个小于或等于工作?我收到了一个错误。

var filteredProducts = Products.Where(p => p.State.Contains("Bruikbaar"))
                               .Where(p => p.Privilege <= ui.GetPrivilegeNumber())
                               .ToList(); 

错误:

  

LINQ to Entities无法识别方法'Int32 GetPrivilegeNumber()'方法,并且此方法无法转换为商店表达式。

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

4 个答案:

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

上述查询生成相同的输出但很容易理解。