繁体   English   中英

使用 EF-Core 进行自 JOIN 查询

[英]Self JOIN query using 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 Core。 有没有更有效的方法来构建上述查询?

我可以想象这样的事情

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

并检查返回值,所以在 EF

var v = await repository
    .AsNoTracking()
    .Where(t => t.model == model && 
               (t.name == 'Name1' && t.value='Value1' || 
                t.name == 'Name2' && t.value == 'Value2'))
    .CountAsync();

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

评论太长了。

哪个更快取决于您的数据、您的数据 model 以及运行它的系统。 因此,您应该在系统上测试这两个版本。

但是,一般来说, exists可以在它遇到的与条件匹配的第一行处停止。 假设您有适当的索引,那么join的开销应该是最小的。 因为它可以更快地停止,所以可以合理地假设该版本比使用聚合的方法更快。 聚合需要找到所有匹配项,因此即使只有一个匹配项,也需要继续查找所有匹配项以返回计数 1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM