2015-11-19 4 views
0

Как я могу сделать это меньше или равно работать в моем .Where() предложение? Я получаю сообщение об ошибке.ASP.NET Entity Framework .Where() с малым

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

Ошибка:

LINQ to Entities does not recognize the method 'Int32 GetPrivilegeNumber()' method, and this method cannot be translated into a store expression.

Я надеюсь, что этот вопрос никогда не задавался. Googled не смог найти его, либо я использую неправильные слова, чтобы выразить свою проблему.

+3

Что не так: 'var filtersProducts = Products.Where (p => p.State.Contains (" Bruikbaar ") && p.Privilege <= ui.GetPrivilegeNumber()). ToList();' Что не является работать с ним? –

+2

Если у вас есть результаты, которые отличаются от ожидаемых, или когда вы получаете сообщение об ошибке, то вам следует описать, какие результаты у вас есть сейчас и каковы ваши ожидания. –

+0

Эта ошибка: LINQ to Entities не распознает метод 'Int32 GetPrivilegeNumber()', и этот метод не может быть переведен в выражение хранилища. – 6kgstront

ответ

2

Вам нужно для перемещения ui.GetPrivilegeNumber() вне запроса. Вы также можете объединить эти Where запросы в один:

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

Решил проблему и улучшил код. Должен быть ответ. – Antrim

+0

Нет, не компилируется. Вы получите что-то вроде *, не можете наложить лямбду на bool *. Правильный код - «Продукты».Где (p => p.State.Contains («Bruikbaar») && p.Privilege <= privilegeNumber) .ToList(); ' –

+0

@SergeyBerezovskiy Ой, пропустил скобку спасибо! – DavidG

4

ui.GetPrivilegeNumber() не является признанным методом.

Используйте это:

var uiPrivilege = ui.GetPrivilegeNumber(); 

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

И как другие пользователи mentionted, вы можете оптимизировать Where.

+0

Приятно было сработать. Спасибо! – 6kgstront

+0

GetPrivilegeNumber isnt член Linq ... –

3

EF не выполняет вызовы методов, которые вы используете в предикатах. Он хранит их как выражение (т. Е. Дерево синтаксиса), а затем анализирует это дерево, чтобы построить SQL-запрос, переведя код C# в код 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 
+1

Спасибо за справочную информацию. Я понимаю EF немного больше сейчас :) – 6kgstront

0

Вы можете использовать другой метод оценки внутри Linq. Чтобы упростить код, вы можете использовать его немного по-старому для записи LinQ.

var uiPrivilege = ui.GetPrivilegeNumber(); 

var filteredProducts =(from p in Products 
         where p.State.Contains("Bruikbaar") && p.Privilege <= uiPrivilege 
         select p).ToList(); 

Вышеприведенный запрос генерирует такой же результат, но его легко понять.

Смежные вопросы