使用EF-Core进行自我加入查询

时间:2020-06-08 09:14:26

标签: c# sql ef-core-3.1

我有一个旧的存储过程,该过程从自引用表中选择数据。

objcopy

我们将代码移至EF Core。有没有更有效的方法来建立上述查询?

我可以想象这样的事情

exists (select * 
        from MyTable t1
        join MyTable t2 on t1.model = t2.model
        where t1.name = 'Name1'
          and t1.value = 'Value1'
          and t2.name = 'Name2'
          and t2.value = 'Value2'
          and t1.model = @model)

并检查返回值,因此在EF

SELECT COUNT(*)
FROM MyTable 
WHERE 
    (model= @model) AND (
    (name = 'Name1' AND value = 'Value1') OR
    (name = 'Name2' AND value = 'Value2'))

与JOIN相比,这是一种更有效的方法吗?我可以看到有所不同,但是根据我们数据的性质,结果应该是相同的。

1 个答案:

答案 0 :(得分:0)

这个评论太长了。

哪个更快取决于您的数据,您的数据模型和运行您的系统。因此,您应该在系统上测试这两个版本。

通常,exists可以停在遇到的符合条件的第一行。假设您有适当的索引,则join的开销应该最小。因为它可以更快地停止,所以可以合理地假设该版本比使用聚合的方法要快。汇总要求找到 all 个匹配项,因此,即使只有一个匹配项,也需要继续寻找所有匹配项以返回1。