2013-12-17 3 views
3

У моей модели данных есть объект Person с 3 связанными (1: N) субъектами Jobs, Tasks и Dates.Entity Framework: Макс. число «подзапросов»?

Мой запрос выглядит

var persons = (from x in context.Persons 
select new { 
    PersonId = x.Id, 
    JobNames = x.Jobs.Select(y => y.Name), 
    TaskDates = x.Tasks.Select(y => y.Date), 
    DateInfos = x.Dates.Select(y => y.Info) 
}).ToList(); 

Все, кажется, работает хорошо, но списки JobNames, TaskDates и DateInfos не все заполнены.

Например, TaskDates и DateInfos имеют правильные значения, но JobNames остается пустым. Но когда я удаляю TaskDates из запроса, то JobNames правильно заполняется.

Похоже, что EF может обрабатывать ограниченное число этих «подзапросов»? Это верно? Если да, то какой макс. число этих «подзапросов» для одного утверждения? Есть ли способ обойти эту проблему без необходимости делать несколько звонков в базу данных?

(пс: Я не совсем уверен, но я помню, что этот запрос работал в LINQ2SQL - это может быть?)

UPDATE

Я получаю с ума по этому поводу. Я попытался воспроизвести проблему с нуля, используя свежий простой проект (чтобы опубликовать здесь весь фрагмент кода, а не только упрощенный пример), и я обнаружил, что не смог его воспроизвести. Это все еще происходит в нашей существующей кодовой базе (видимо, для этой проблемы больше, но я не могу поделиться этой закрытой базой кода, к сожалению).

После нескольких часов и часов игры вокруг, я нашел Вейрдест поведение:

  • Это прекрасно работает, когда я неSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; перед вызовом оператора LINQ
  • Он также отлично работает (независимо от выше), когда я не использовать .Take(), чтобы получить первые строки X
  • Он также отлично работает, когда я добавляю дополнительные .Where() операторы, чтобы сократить количество строк ret urned с SQL Server

я не нашел какой-либо понятной причина, почему я вижу это поведение, но я начал смотреть на SQL: Хотя EF генерирует тот же SQL, план выполнения отличается, когда я использую READ UNCOMMITTED , Он возвращает еще строк по определенному индексу в середине плана выполнения, который с любопытством заканчивается на минус строк, возвращенных для всего оператора SQL, что, в свою очередь, приводит к отсутствию данных, что является причиной моего вопроса Начать с.

Это звучит очень запутанно и невероятно, я знаю, но это поведение, которое я вижу. Я не знаю, что еще делать, я даже не знаю, что делать Google на данный момент ;-).

Я могу исправить свою проблему (просто не используйте READ UNCOMMITTED), но я понятия не имею, почему это происходит, и если это ошибка или что-то, что я не знаю о SQL Server.Возможно, в SQL Server есть какое-то «магическое максимальное количество разрешенных результатов в подзапросах»? По крайней мере: насколько я понимаю, это не проблема с EF.

+1

Посмотрите на 'вар человек = (от х в context.Persons выберите новый { PersonId = x.Id, JobNames = x.Jobs.Select (у => y.Name), TaskDates = x.Tasks.Select (y => y.Date), DateInfos = x.Dates.Select (y => y.Info) }). ToString() 'и проанализировать sql. Это может понизить некоторый свет к поблему. – Oybek

+0

Не могли бы вы попробовать: JobNames = context.Jobs.Where (j => j.Person.Id == x.Id). Выбрать (j => j.Name) –

+0

Мои догадки: 1) Запрос требует 'MultipleActiveResultSets = True; '2). Схема объектов не построена должным образом. – Oybek

ответ

0

Немного поздно, но вызывает ли вызов ToList() для каждого подзапроса необходимый эффект?

var persons = (from x in context.Persons 
select new { 
    PersonId = x.Id, 
    JobNames = x.Jobs.Select(y => y.Name.ToList()), 
    TaskDates = x.Tasks.Select(y => y.Date).ToList(), 
    DateInfos = x.Dates.Select(y => y.Info).ToList() 
}).ToList(); 
+0

Джон, спасибо за предложение. Да, я попробовал ' ToList() 'Нет, это не помогло, результат остался прежним. Я думаю, что источником моей проблемы является SQL Server, а не EF (см. Мое обновление). –

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