У моей модели данных есть объект 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.
Посмотрите на 'вар человек = (от х в 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
Не могли бы вы попробовать: JobNames = context.Jobs.Where (j => j.Person.Id == x.Id). Выбрать (j => j.Name) –
Мои догадки: 1) Запрос требует 'MultipleActiveResultSets = True; '2). Схема объектов не построена должным образом. – Oybek