sql server语言 - 在EF中使用左连接而不是联合



当我在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();
}

相关内容

  • 没有找到相关文章

最新更新