对同一对象进行多个查询的任意()Linq方法。C#EF核心
我做了几次搜索,我仍在努力解决这个问题。 我想使用sql server Exists()在EF core上执行此查询: 问题是,在sql server中,执行下面的查询大约需要2秒钟。在C#上,使用Any()方法需要1分钟以上的时间。它使 对HutOperationHistory和HutPropertyValue表的若干查询 //需要1-2秒对同一对象进行多个查询的任意()Linq方法。C#EF核心,c#,sql-server,linq,entity-framework-core,C#,Sql Server,Linq,Entity Framework Core,我做了几次搜索,我仍在努力解决这个问题。 我想使用sql server Exists()在EF core上执行此查询: 问题是,在sql server中,执行下面的查询大约需要2秒钟。在C#上,使用Any()方法需要1分钟以上的时间。它使 对HutOperationHistory和HutPropertyValue表的若干查询 //需要1-2秒 select * From Hut h where exists( select 1 from HutOperationHistory
select * From Hut h where exists(
select 1 from HutOperationHistory
where HutId = h.HutId and HutOperationId = 4
)
and exists(
select 1 from HutPropertyValue
where HutId = h.HutId and Value = 'HUT_SUPPLIER_PROPERTY_NAME'
)
and exists(
select 1 from HutPropertyValue
where HutId = h.HutId and Value = 'BUY_ORDER_PROPERTY_NAME'
)
and exists(
select 1 from HutPropertyValue
where HutId = h.HutId
and Value = 'WORK_ORDER_PROPERTY_NAME'
)
我在linq上做的,是这样的:
// takes more then 1 minute
var huts = coreDbContext.Huts
.Include(x => x.PropertyValuesList).ThenInclude(y => y.HutProperty)
.Include(x => x.OperationHistoriesList)
.Where(
x =>
x.OperationHistoriesList.Any(
z => ( z.HutOperation.hutOperationId = 4 )
)
&& x.PropertyValuesList.Any(b =>
b.Value.Equals(hutSupplierPropName, StringComparison.CurrentCultureIgnoreCase)
)
&& x.PropertyValuesList.Any(b =>
b.Value.Equals(buyOrderPropName, StringComparison.CurrentCultureIgnoreCase)
)
&& x.PropertyValuesList.Any(b =>
b.Value.Equals(workOrderPropName, StringComparison.CurrentCultureIgnoreCase)
)
)
.OrderBy(x => x.Order)
.ToList();
我能做些什么来加快速度吗
提前谢谢 请尝试Count()>0,而不是Any()。在过去,我使用它获得了性能提升你能做内部联接而不是where子句吗?我不能在linq上做那些类型的内部联接。我需要使用类似于exists()的东西。您能更具体地解释一下为什么不能使用内部联接吗?您可能根本不应该使用include,除非您需要返回的对象填写所有这些属性。但你不是在用这种方式比较苹果。您最初的SQL查询并没有返回每个表中的所有数据,但您正在将LINQ查询强制为。EF针对“最常见”的情况进行了优化。它也几乎是一个黑匣子。因此,如果您不喜欢它从LINQ生成SQL的方式,那么您可以编写自己的SQL并只使用EF的ORM部分。