[英]ASP.NET Core 5.0 Linq Outer Join
Movements
and Equipment
...Movements
和Equipment
...
Movements
have Equipment
.Movements
都有Equipment
。Movements
that do have Equipment
.Equipment
的Movements
联系起来。OUTER JOIN
so I can access all of the Movements
even if they do not have any Equipment
.OUTER JOIN
以便我可以访问所有Movements
,即使它们没有任何Equipment
。Movements
that have matching Equipment
records in the bridge table.Equipment
记录的Movements
。Movements = (
from mvmt in applicationDbContext.Movements
join mvmteq in applicationDbContext.MovementEquips on mvmt .MvmtId equals mvmteq.MvmtId
join equip in applicationDbContext.Equipment on mvmteq.EquipId equals equip .EquipId
orderby mvmt.MvmtId
select new Movement
{
MvmtId = mvmt.MvmtId,
MvmtDescr = mvmt.MvmtDescr
})
.ToList();
var query =
from mvmt in applicationDbContext.Movements
join mvmteq in applicationDbContext.MovementEquips on mvmt.MvmtId
equals mvmteq.MvmtId
join equip in applicationDbContext.Equipment on mvmteq.EquipId equals
equip.EquipId into g
from mvmteq in g.DefaultIfEmpty()
where mvmt.MvmtId != null
select new
{
MvmtId = mvmt.MvmtId,
MvmtDescr = mvmt.MvmtDescr
}).ToList();
Please refer to https://docs.microsoft.com/en-gb/dotnet/csharp/linq/perform-left-outer-joins请参考https://docs.microsoft.com/en-gb/dotnet/csharp/linq/perform-left-outer-joins
and和
http://msdn.microsoft.com/en-us/library/bb397895.aspx http://msdn.microsoft.com/en-us/library/bb397895.aspx
Movements = (
from mvmt in applicationDbContext.Movements
join mvmteq in applicationDbContext.MovementEquips on mvmt.MvmtId equals mvmteq.MvmtId into join_1
from mvmteq in join_1.DefaultIfEmpty()
join equip in applicationDbContext.Equipment on mvmteq.EquipId equals equip.EquipId into join_2
from equip in join_2.DefaultIfEmpty()
select new GetMovementRequest
{
MvmtId = mvmt.MvmtId,
MvmtDescr = mvmt.MvmtDescr,
MvmtMetrics = mvmt.MvmtMetrics,
MvmtStandard = mvmt.MvmtStandard,
EquipId = equip.EquipId,
EquipDescr = equip.EquipDescr
}
).ToList();
OUTER JOIN
query.OUTER JOIN
查询。Movement
and all Equipment
data then all you need is this:Movement
和所有Equipment
数据,那么您只需要以下内容:static async Task<( IReadOnlyList<Movement> allMovements, IReadOnlyList<Equipment> allEquipment )> LoadEverythingAsync( this ApplicationDbContext db, CancellationToken cancellationToken )
{
IReadOnlyList<Movement> allMovements;
IReadOnlyList<Equipment> allEquipment;
{
List<Movement> mov = await db.Movements.ToListAsync( cancellationToken ).ConfigureAwait(false);
List<Equipment> eqp = await db.Equipment.ToListAsync( cancellationToken ).ConfigureAwait(false);
await db.MovementEquips.LoadAsync( cancellationToken ).ConfigureAwait(false);
allMovements = mov;
allEquipment = eqp;
}
return ( allMovements, allEquipment );
}
The code above "works" because the Entity Framework DbContext
performs magic whenever you load data into the DbContext
(from both ToListAsync
and LoadAsync
) such that all attached and loaded entities will have their reference and navigation properties' setters invoked.上面的代码“有效”是因为实体框架
DbContext
会在您将数据加载到DbContext
(来自ToListAsync
和LoadAsync
)时执行魔术,这样所有附加和加载的实体都会调用它们的引用和导航属性的设置器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.