2012-05-17 3 views
0

Это работает:Entity Framework не уважая ленивые вычисления

var user = db.Users.OrderByDescending(u => u.Id).FirstOrDefault(u => u.Email == "[email protected]" && u.Password == "8a79hjhfas8d7fd89"); 

Это правильно генерирует оператор SQL, который возвращает только один пользователь.

Код, который теоретически один и тот же, приводит всех пользователей из базы данных и только применяет фильтр после этого. Он работает, как если бы я делал .ToList(), таким образом, оценить все из базы данных, и применения фильтра в регулярной IEnumerable, вместо того, чтобы генерировать правильное утверждение SQL:

public static User Get(Func<User, bool> predicate) 
{ 
    return db.Users.OrderByDescending(u => u.Id).FirstOrDefault(predicate); 
} 

var user = User.Get(u => u.Email == "[email protected]" && u.Password == "8a79hjhfas8d7fd89"); 

Является ли это ошибка на Entity Рамочной или я чего-то не хватает?

ответ

1

Вы проходите команду Func<>, которая является скомпилированным делегатом. Вместо этого вы должны передавать Expression<> в качестве параметра Get, который является деревом синтаксиса, который EF может анализировать и генерировать запрос вместо того, чтобы выполнять метод делегата по каждому результату.

0

EF не знает, как перевести произвольные делегаты Func в SQL, поэтому у него нет выбора, кроме как загрузить весь набор данных, а затем запустить предикат в этом результирующем наборе.

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