当我在EF中包含多个属性时,它会生成'UNION ALL' SQL查询来包含它们。如果我要包含3个属性,运行它几乎要慢3倍。如果我用3个左连接创建相同的查询,它的性能会好得多…
当linq生成查询时,是否可以使用左连接而不是联合?
如果这是不可能的,是什么原因使用联合所有,这似乎很慢?
首先,您可以使用DefaultIfEmpty在LINQ中对实体执行左连接。
其次,如果你的导航属性是1:N(而不是1:1或1:0. 1),那么使用3个连接将严重增加数据库的输出量,这将降低性能,在这种情况下,运行一个查询来检索主要实体,然后3个基于第一个查询的id的额外查询,使用。future()扩展在单个DB调用中运行,将导致更好的性能。
。
var entities = context.Entities.AsQueryable().Where(...).ToList();
var ids = entities.select(e => e.Id).ToList();
var subEntities1Query = context.SubEntities1.AsQueryable().Where(se1 =>
ids.Contains(se1.ParentId)).Future();
var subEntities2Query = context.SubEntities2.AsQueryable().Where(se2 =>
ids.Contains(se2.ParentId)).Future();
var subEntities3Query = context.SubEntities3.AsQueryable().Where(se3 =>
ids.Contains(se3.ParentId)).Future();
var subEntities1 = subEntities1Query.ToList();
var subEntities2 = subEntities2Query.ToList();
var subEntities3 = subEntities3Query.ToList();
foreach (var entity in entities)
{
entity.SubEntities1 = subEntities1.Where(se1 =>
se1.ParentId = entity.Id).ToList();
entity.SubEntities2 = subEntities2.Where(se2 =>
se2.ParentId = entity.Id).ToList();
entity.SubEntities3 = subEntities3.Where(se3 =>
se3.ParentId = entity.Id).ToList();
}