Почему это объединение не работает с Entity Framework v4? - PullRequest
2 голосов
/ 23 января 2010

Я использую Entity Framework v4 (только код). Если я сделаю

var result = from person in context.People.Include("Cars")
             select new { person, person.Houses.Count, bar, foo, etc };

тогда result.First().Cars равно нулю. Если я так делаю, это работает, но мне нужно Houses.Count:

var result = from person in context.People.Include("Cars")
             select person;

Кажется, Entity Framework v4 не очень хорошо работает с инициализаторами объектов?

На данный момент решение таково:

var result = from person in context.People.Include("Cars").Include("Houses")
             select person;

Но спектакль смешной, мне нужно привести Хауса в ряд!

Ответы [ 3 ]

0 голосов
/ 24 января 2010
var result = from person in context.People.Include("Cars")
             select new {  
                 Person = person, 
                 Cars = person.Cars,
                 HouseCount = person.Houses.Count()
             };

Избыточный, конечно, но Person.Cars будет заполнен, сейчас.

0 голосов
/ 29 января 2010

http://connect.microsoft.com/VisualStudio/feedback/details/527749/join-bug-at-ef4-code-only

Привет Фелипе,

Когда к запросу применяется Включить, оно добавляет дополнительный «диапазон запроса» информация к запросу, который затем используется позже, когда запрос фактически выполнен. Диапазон запроса информация используется для внутренних перепишите запрос так, чтобы объекты что может быть достигнуто через указанные свойства навигации также принес из базы данных и материализовались.

Когда применяются другие операторы запросов после включения мы пытаемся сохранить это информация о диапазоне запроса. Тем не менее информация о диапазоне запроса, указанная в Включить не будет течь по запросу оператор, который меняет тип результата запроса.

Например, в таком запросе: var result = от человека в контексте. Люди. Люди ("Автомобили") выберите новый {person, person.Houses.Count, bar, foo, etc};

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

var result = 
    from person in context.People
    select new { person, person.Houses.Count, bar, foo, etc };
var resultWithCars =
    result.Include("Cars");

В этом случае, однако, результат что Включить будет выбрасывать исключение во время выполнения (в отличие от сбоя молча) потому что диапазон запроса не может действительно применяется к анонимному тип.

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

Если вы хотите сделать проекцию в анонимный тип как этот, и вы хотите чтобы получить собственность Автомобили, есть на самом деле очень простой способ. Просто включить собственность автомобилей в проекция, как это:

var result = 
    from person in context.People
    select new { person, person.Cars, person.Houses.Count, bar,

foo и т. Д.};

В настоящее время мы рассматриваем некоторые улучшения API диапазона запросов для будущие версии, которые могут касаться такие вопросы, поэтому ваш отзыв очень ценится Но так как мы не планирование улучшений для текущего отпусти и сохраняем будущее улучшения в нашем внутреннем отставании, Я продолжу решать текущий рабочий элемент.

Спасибо, Диего Вега Entity Framework Команда

0 голосов
/ 23 января 2010

выстрел в темноте ..

ли:

var results = from person in context.Person
              let count = person.Houses.Count()
              select new {person, count };

Работа? Честно говоря, я думал, что ваш первый запрос должен сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...