Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在包含IncludeProperty的EF中使用左连接而不是并集_Sql Server_Linq_Entity Framework - Fatal编程技术网

Sql server 在包含IncludeProperty的EF中使用左连接而不是并集

Sql server 在包含IncludeProperty的EF中使用左连接而不是并集,sql-server,linq,entity-framework,Sql Server,Linq,Entity Framework,当我在EF中包含多个属性时,它会生成“UNION ALL”SQL查询来包含它们。如果我要包含3个属性,那么运行它的速度几乎要慢3倍。 如果我用3个左连接创建相同的查询,它的性能会更好 在linq生成查询时,是否可以使用左连接而不是联合 如果不可能,那么使用union all的原因是什么,它看起来很慢?首先,您可以执行 其次,如果导航属性为1:N(而不是1:1或1:0..1),则使用3个联接将严重增加数据库的输出量,这将降低性能,在这种情况下,运行一个查询来检索主要实体,然后根据第一个查询的ID再

当我在EF中包含多个属性时,它会生成“UNION ALL”SQL查询来包含它们。如果我要包含3个属性,那么运行它的速度几乎要慢3倍。 如果我用3个左连接创建相同的查询,它的性能会更好

在linq生成查询时,是否可以使用左连接而不是联合


如果不可能,那么使用union all的原因是什么,它看起来很慢?

首先,您可以执行

其次,如果导航属性为1:N(而不是1:1或1:0..1),则使用3个联接将严重增加数据库的输出量,这将降低性能,在这种情况下,运行一个查询来检索主要实体,然后根据第一个查询的ID再运行3个查询,使用.Future()扩展名在单个DB调用中运行,将获得更好的性能

例如


你能提供你的代码和结果的例子吗?谢谢,这很有意义。Future看起来也很有趣,可能会有所帮助,只是需要找到使用它的方法,因为查询在不同的对象中。
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();
}