C#Join by Linq应该如何传递innerKeySelector



应该如何传递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属性。这将成为内部连接

最新更新