我正在尝试在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.
答案 0 :(得分:1)
我尝试使用空集合的代码,但我没有得到NullReferenceException
,所以实际上只有三种可能性:
context
是null
context.EntityOnes
至少包含一个null
对象context.Comments
至少包含一个null
对象如果你说的数据库真的是空的,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的“默认”实例。