应该如何传递innerKeySelector?
具有:
model1 - {int model1 Id, int model2Id, model2 Model2}
model2 - {int model2Id, List<model1> modelsRef, ...(other)}
需要做的事情:
query.Join(context.model2, x => x.Model2, y => y.modelsRef, (x,y) => new{
Id = x.mdel1Id,
(other)...}).Select();
有编译错误:
{
...
"message": "The type arguments for method 'Enumerable.Join<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, TInner, TResult>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. [ProjectName]",
}
因此,您有一个Model2s
序列,其中每个Model2
都有零个或多个Model1s
。每个Model1
恰好属于一个Model2
,使用外键Model1Id
,这是一个相当标准的一对多关系。
当使用实体框架时,你会有类似的东西:
class Model2
{
public int Id {set; set;}
// every Model2 has zero or more Model1s:
public virtual ICollection<Model1> Model1s {get; set;}
...
}
class Model1
{
public int Id {set; set;}
// every Model1 belongs to exactly one Model2, using foreign key
public int Model2Id {get; set;}
public virtual Model2 Model1 {get; set;}
...
}
记住:
在实体框架中,表的列由类的非虚拟属性。虚拟属性表示表之间的关系。
注意:我已将您的List<Model1> Model1s
更改为ICollection<Model1> Model1s
。毕竟,你确定这是一个列表吗?Model1s[4]
是什么意思?
您希望使用标准内部联接:来联接模型1和模型2
var result = dbContex.Model1s
.Join(dbContext.Model2s, // join Model1s and Model2s
model1 => model1.Model2Id, // from every Model1 take the foreign key Model2Id
model2 => model2.Id, // from every Model2 take the primary key Id
(model1, model2) => new // when they match use the matching models to create
{ // a new object with the following properties
SomeProperty = model1.PropertyA,
SomeOtherProperty = model2.PropertyB,
MyX = model2.PropertyC,
MyY = model1.PropertyD,
....
});
使用虚拟属性而不是联接
一些人评论说,在使用实体框架时不需要使用联接。他们是对的。使用集合可以获得相同的结果。结果感觉更自然,可读性更强:
var result = dbContext.Model1s.Select(model1 => new
{
SomeProperty = model1.PropertyA,
SomeOtherProperty = model1.Model2.PropertyB,
MyX = model1.Model2.PropertyC,
MyY = model2.PropertyD,
});
实体框架了解您的一对多关系,并将为您进行内部连接。
若要创建GroupJoin:
如果您有父子一对多关系,并且您需要某些"父母带着他们的全部或部分孩子",则从parent开始,并使用ICollection获取孩子。这将成为GroupJoin。
若要进行内部联接
如果您需要一些"与父母在一起的孩子",请从"孩子"开始并使用Parent属性。这将成为内部连接