LINQ-to-entity просто делает что-то не так.
Нет, работает как задумано. L2E будет только JOIN
в таблицах, когда вы заставите его. Это улучшает производительность. Пока вы находитесь в L2E, вы можете ссылаться на любые отношения. Вот почему это работает:
SelectedItem = _entities.Table2.First(
o => o.Table2.SomeColumn == SomeProperty).SomeOtherColumn;
Ваше лямбда-выражение здесь будет интерпретировано LINQ to Entities и преобразовано в SQL. С другой стороны, это:
var resultSet =
(from o in _entities.Table1
where o.Table2.Table3.SomeColumn == SomeProperty
select o
).First();
SelectedItem = resultSet.Table2.SomeOtherColumn;
... дает результат типа Table1
. Вы находитесь сейчас в объектном пространстве. Поскольку ваш запрос не заставляет загружаться Table2
, L2E не будет генерировать для него столбцы SQL. Это приводит к более эффективному SQL, когда вам не нужен Table2
. Когда вы это сделаете, вы должны сказать так:
var resultSet =
(from o in _entities.Table1.Include("Table2")
where o.Table2.Table3.SomeColumn == SomeProperty
select o
).First();
SelectedItem = resultSet.Table2.SomeOtherColumn;
Это будет работать. Однако , ваш First(lambda)
метод, описанный выше, является лучшим решением . (Сравните SQL.)