2012-04-21 4 views
2

У меня есть метод, который получает все данные из View внутри моей базе данных:EF не ленивые нагрузки Просмотров

public IQueryable<vw_FullWebIgnoringApprovalStatus> GetAllFullWebIgnoringApprovalStatus() 
{ 
    IQueryable<vw_FullWebIgnoringApprovalStatus> query = 
     Context.vw_FullWebIgnoringApprovalStatus; 

    return query; 
} 

Когда я выполнить следующий метод, он немедленно выполняет запрос, который он не должен:

var model = _repo.GetAllFullWebIgnoringApprovalStatus() 
    .Where(x => 
     (!reid.HasValue && !destid.HasValue && !coid.HasValue) || 
     (reid.HasValue && x.Reid == reid.Value) || 
     (destid.HasValue && x.Destid == destid.Value) || 
     (coid.HasValue && x.Coid == coid.Value) 
    ); 

Он должен был лениво загрузить запрос, и это не так. Это связано с представлением? Я использую EntityFramework.4.3.1.

+0

I согласитесь, что он не должен «немедленно выполнять запрос». Что заставляет вас думать, что это так? –

+0

@NicholasButler SQL Profiler, который показал мне, что это действие получает 248 строк из таблицы, которая заняла ок. 6 секунд для завершения. – tugberk

+0

Можете ли вы разместить свою модель –

ответ

2

Я не верю, что HasValue распознается LINQ to Entities, потому что нет способа его преобразования в SQL. Поэтому я думаю, что в этом случае L2E должен выполнить запрос, прежде чем он сможет оценить HasValue. Я раньше этого не видел. Мне нужно найти другой способ выразить свой тест на недействительность. И мне было бы интересно увидеть SQL.

Вот одна интересная идея: http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/56484ed7-9664-44f4-84a0-69da3901c817

Есть все виды странное поведение с помощью LINQ вокруг nullables, так что вы должны действительно обратить внимание на результаты ->http://msdn.microsoft.com/en-us/library/bb738687.aspx

НТН Julie

+0

А, да. Это может быть так. Я буду проверять его и посмотреть, не проблема. благодаря! – tugberk

+0

Хорошо, это была проблема. Как только я удалил LINQ 'Where'clause, он начал ленивую загрузку. Но, по-видимому, у меня есть другая проблема с моей логикой подкачки, которую я вызвал после вышеупомянутого запроса. Еще раз спасибо! – tugberk

+0

Я думаю, вы знаете это, но я просто хочу быть уверенным, что будущие читатели не ошибаются, так как это вызвано предложением Where. Вопрос должен быть специфичным для HasValue внутри предложения Where. Можете ли вы проверить, что это работает с более простым предложением Where, которое не заставляет его выполнять запрос, пока вы специально не сделаете что-то, чтобы вызвать executeg. –