Проблема доступа к ассоциации из результата лямбда-запроса - PullRequest
2 голосов
/ 24 августа 2010

У кого-нибудь были проблемы с установкой ассоциаций для загрузки с использованием LINQ to SQL, когда ваша дочерняя запись была загружена с помощью лямбда-запроса?Например:

var orderLine = db.OrderLines.
    Where(ol => ol.ID == orderLineID select ol).
    First();
// navigate to order via the association
var order = orderLine.GetOrder();

По сути, я получаю нулевой результат от GetOrder ().

Но если я сделаю это вместо:

var orderLine = (from ol in db.OrderLines where ol.ID == orderLineID).First();
var order = orderLine.GetOrder();

Работает нормально.

Что может вызвать это?Это ошибка?

РЕДАКТИРОВАТЬ: Вот фактический код, который работает с лямбда-выражением закомментировано, что не работает

var msg = db.Messages.Where(m => m.ID == msgID).First();
if (msg.SentTS.HasValue) return;

// Get the message recipients
// I don't get it.. why doesn't lambda expressions work here? returns 0 results!
// var testtos = msg.GetMessageTos.Where(mt => mt.Active);
var tos = from mt in db.MessagesTos
          where mt.Active && mt.MessageID == msgID
          select mt;

Ответы [ 3 ]

0 голосов
/ 09 сентября 2010

Мне кажется, что проблема больше связана с ассоциацией, чем с лямбда-выражениями.

В вашем сценарии это должно работать:

var tos = db.MessagesTos.Where(mt=> mt.Active && mt.MessageID);

пока этого не будет:

var tos = from mt in msg.SentTS
          where mt.Active
          select mt;

Что касается того, почему это не работает, я предлагаю взглянуть на ассоциацию в конструкторе и проверить, правильно ли она соответствует модели БД (соответствуют правильным столбцам). Я также предлагаю подтвердить, что msg.SentTS фактически становится пустым, независимо от того, выполняете ли вы какие-либо дальнейшие запросы.

0 голосов
/ 27 января 2011

Смотрите мой EDIT для кода, который работает. Я думаю, иногда «Ответ» - делать то, что работает, а не обязательно то, что вы понимаете.

0 голосов
/ 24 августа 2010

Вы также можете попробовать это, я думаю, что это немного чище.

var orderLine = db.OrderLines.Single( ol => ol.ID == orderLineID ); 
var order = orderLine.GetOrder(); 

Я верю в вашем нерабочем примере, вы хотите использовать .First() вместо .Single().

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