Примечание: Я знаю, что существует ряд вопросов по вопросам, связанным с проблемами Linq. Включение (таблица), не загружающее данные, я считаю, что исчерпал опции, которые люди перечисляли, и все еще были проблемы.Linq2Entities Include with Skip/Take-load issue
У меня есть большой запрос Linq2Entities для приложения, которое я поддерживаю. Запрос строится так:
IQueryable<Results> query = context.MyTable
.Where(r =>
r.RelatedTable.ID == 2 &&
r.AnotherRelatedTable.ID == someId);
Тогда предикаты построены в зависимости от различных бизнес-логики, такие как:
if (sortColumn.Contains("dob "))
{
if (orderByAscending)
query = query.OrderBy(p => p.RelatedTable.OrderByDescending(q => q.ID).FirstOrDefault().FieldName);
else
query = query.OrderByDescending(p => p.RelatedTable.OrderByDescending(q => q.ID).FirstOrDefault().FieldName);
}
Примечание - всегда есть порядок сортировки при условии.
Первоначально включены таблицы были установлены в начале, после прочтения статьи, такие как знаменитый Tip 22, так что теперь они сделаны в конце (который не решить эту проблему):
var resultsList = (query.Select(r => r) as ObjectQuery<Results>)
.Include("RelatedTable")
.Include("AnotherRelatedTable")
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage);
Казалось бы, в random (приблизительно для каждых 5000 пользователей сайта, эта проблема возникает один раз), данные RelatedTable не загружаются. Это может быть грубо принудительно, вызвав нагрузку на связанную таблицу. Но даже сбой при загрузке несовместим, я запускаю запрос при тестировании, и он работает, но в большинстве случаев он не меняет никакого кода или данных.
Это нормально, когда пропуск и прием не включены, и весь набор данных возвращается, но я бы ожидал пропустить и сделать это на полном наборе данных - это, безусловно, связано с профилированием SQL ...
ОБНОВЛЕНИЕ 16/11/10: Я профилировал SQL против набора данных проблемы, и я смог воспроизвести запрос с ошибкой около 9/10 раз, но в итоге остальное. Выполняемый SQL идентичен, когда запрос терпит неудачу или преуспевает, за исключением, как и ожидалось, параметров, переданных в SQL.
Вопрос был решен со следующим изменением, но остается вопрос, почему это должно быть.
В противном случае - получить LINQ для обработки строк:
var resultsList = (query.Select(r => r) as ObjectQuery<Results>)
.Include("RelatedTable")
.Include("AnotherRelatedTable")
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage)
.ToList();
Working - перечислить данные затем получить строки:
var resultsList = (query.Select(r => r) as ObjectQuery<Results>)
.Include("RelatedTable")
.Include("AnotherRelatedTable")
.ToList()
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage);
К сожалению, SQL создает этот запрос содержит некоторые важные данные схемы, так что я не может опубликовать его, это также 1400 строк, поэтому я бы не стал публиковать его в любом случае!
Это L2E или L2SQL? –
Извините, L2E ... не знаю, почему я писал L2SQL! – Timbo
Значит, вы говорите, что SQL - это то же самое для рабочего запроса запроса и запроса запроса, который терпит неудачу? –