Проблема Linq при попытке проекции левого соединения с несколькими записями - PullRequest
1 голос
/ 31 марта 2011

Я пытаюсь выполнить левое соединение в linq с таблицей, которая имеет отношение один ко многим. Мне нужно установить свойство коллекции, но я не могу заставить его работать
Пример моего кода (я изменил имена объектов):

context =>
   from entity1 in context.EntityOnes
   join comment in context.Comments on entity1.Id equals comment.CommentSourceId into tmpComments
   from comment in tmpComments.DefaultIfEmpty()
   select new EntityOneData
       {
           EntityOne = entity1,
           EntityOneComments = tmpComments
       };

Когда я получаю данные для запроса, я получаю исключение nullreference. база данных пуста, но DefaultIfEmpty должен принести хотя бы пустую коллекцию, а не возвращать ноль

EntityOneComments is an IEnumerable<Comment>

Я также пытался сделать последнюю строку, как

EntityOneComments = tmpComments.ToList()

но безрезультатно, я получил странную ошибку, подобную этой:

LINQ to Entities does not recognize the method 'System.Collections.Generic.List1[RecipeCategoryItem] ToList[RecipeCategoryItem](System.Collections.Generic.IEnumerable1[RecipeCategoryItem])' method, and this method cannot be translated into a store expression.

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Я попробовал ваш код с пустыми коллекциями, но не получил NullReferenceException, так что на самом деле есть только три возможности:

  1. context является null
  2. context.EntityOnes содержит хотя бы один null объект
  3. context.Comments содержит хотя бы один null объект

Если ваша база данных действительно пуста, как вы говорите, единственной причиной NullReferenceException может быть причина 1.

0 голосов
/ 31 марта 2011

Я думаю, что ошибка более прозаична, чем то, что вы "отлаживаете". Это DefaultIfEmpty переопределение возвращает ноль, поскольку TSource является ссылочным типом, а значение по умолчанию для ссылочного типа является нулевым. Таким образом, ошибка заключается в предположении, что метод сгенерирует экземпляр TSource по умолчанию.

0 голосов
/ 31 марта 2011

Может быть, я неправильно понимаю, чего вы пытаетесь достичь, но Linq автоматически следит за отношениями 1..n и создает поля в объекте, чтобы представлять их. Рассмотрим эту конструкцию:

Entity

Комментарий

Где 1 Entity имеет много Comment с. Затем в Linq объект, представляющий Entity, имеет поле Comments, которое содержит коллекцию всех комментариев, для которых внешний ключ установлен на первичный ключ сущности. Это поведение по умолчанию для Linq.

Поэтому я думаю, что ваш код должен выглядеть примерно так:

var entitiesWithComments = context.Where(entity => entity.Comments.Count > 0);

Теперь вы можете перебирать коллекцию entitiesWithComments, и каждый объект в ней - это Entity с полем Comments, которое содержит комментарии к этой сущности.

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