2011-03-31 82 views
1

我试图做一个左连接linq到一个有一对多关系的表。我需要设置集合属性,但我不能让它工作
我的代码的例子是(我改变了实体名称):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. 
+2

你意识到,你使用变量名'comment'两次,两个不同的东西?也许这就是问题所在? – 2011-03-31 06:50:22

+0

对不起?你什么意思?我不明白 – 2011-03-31 06:52:44

+1

'在上下文中加入评论。注释'和'来自tmpComments.DefaultIfEmpty()'中的注释。您正在使用变量名称'comment'两次。但是,我不确定这是否是问题。 – 2011-03-31 06:53:49

回答

1

我想你的代码空集,我没有得到NullReferenceException,所以实际上只有三种可能性:

  1. contextnull
  2. context.EntityOnes至少包含一个null对象
  3. context.Comments包含至少一个null物体

如果你的数据库真的是空的,你说,NullReferenceException的唯一原因可能是理由1.

+0

不是空的 – 2011-03-31 07:25:27

+0

@Daniel:再次检查我的答案。这是NRE的三种唯一可能性,如果它确实发生在代码中,那么您向我们展示了这些可能性。 – 2011-03-31 07:26:25

+1

该死的,你是对的。这就是为什么我讨厌嘲笑(当他们没有正确定义)。是的,评论是空的:S 但现在我有另一个问题,我可能会为它创建一个新的问题,因为我运行查询时得到一个stackoverflowexception – 2011-03-31 08:49:06

0

也许我误解你想什么来实现的,但它的Linq遵循automaticaly 1..N关系,使场中的对象来表示它们。考虑这个建筑:

实体

评论

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

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

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

现在,您可以通过收集entitiesWithComments迭代,并在它的每个对象是一个Entity与包含注释这个实体领域Comments

+0

加入我知道你的意思,但事实并非如此。该实体将不会在实体模型中具有与该评论的关系(它是这样设计的,我不能改变它)。所以我需要对上下文进行查询并创建一个将它们连接到相同类型对象的投影。 – 2011-03-31 07:24:04

0

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