LINQ-to-entity - Нулевая ссылка - PullRequest
0 голосов
/ 15 марта 2010

Я могу поклясться, что это работало на днях:

var resultSet =
    (from o in _entities.Table1
     where o.Table2.Table3.SomeColumn == SomeProperty
     select o
    ).First();
SelectedItem = resultSet.Table2.SomeOtherColumn;

В последней строке я получаю исключение нулевой ссылки: resultSet.Table2 имеет значение null.
Я не только уверен, что все внешние ключи и тому подобное имеют правильные значения, но я не вижу, как Table2 может быть нулевым, поскольку o.Table2.Table3.SomeColumn == SomeProperty.

resultSet имеет все правильные значения , за исключением того, что Table2 имеет значение null.

[Редактировать] Это работает:

SelectedItem = _entities.Table2.First(
    o => o.Table2.SomeColumn == SomeProperty).SomeOtherColumn;  

И выше, resultSet имеет все правильные значения, поэтому это не проблема с данными в базе данных; LINQ-to-entity просто делает что-то не так.

Ответы [ 2 ]

5 голосов
/ 15 марта 2010

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.)

0 голосов
/ 15 марта 2010

. Первое, возможно, не возвращает ничего. Вы уверены, что значение SomeProperty существует в SomeColumn в вашем наборе данных?

Оберните все это при использовании .Any (), чтобы определить, есть ли у вас запись, или проверить на null в resultSet.Table2

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