尝试使用多个记录的左连接投影时Linq问题

时间:2011-03-31 06:47:17

标签: c# .net linq linq-to-entities

我正在尝试在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
       };

当我检索查询的数据时,我得到一个nullreferenceexception。数据库为空,但DefaultIfEmpty应该至少带来一个空集合,而不是返回null

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 个答案:

答案 0 :(得分:1)

我尝试使用空集合的代码,但我没有得到NullReferenceException,所以实际上只有三种可能性:

  1. contextnull
  2. context.EntityOnes至少包含一个null对象
  3. context.Comments至少包含一个null对象
  4. 如果你说的数据库真的是空的,NullReferenceException的唯一原因可能是原因1.

答案 1 :(得分:0)

也许我误解了你想要实现的目标,但Linq自动跟随1..n关系并使对象中的Fields代表它们。考虑一下这种结构:

实体

注释

其中1 Entity有多个Comment s。 然后在Linq中,表示Entity的对象具有字段Comments,其中包含将其外键设置为实体主键的所有注释的集合。这是Linq的默认行为。

因此我认为您的代码应该是这样的:

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

现在,您可以遍历集合entitiesWithComments,其中的每个对象都是Entity,其中包含对此实体的注释的字段Comments

答案 2 :(得分:0)

我认为错误比你“调试”错误更加平淡无奇。此DefaultIfEmpty覆盖返回null,因为TSource是引用类型,引用类型的默认值为null。因此,错误是假设该方法将生成TSource的“默认”实例。