core的c#-自连接查询

ct3nt3jp  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(321)

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

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'))

并检查返回值,因此在ef中

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

与连接相比,这是一种更有效的方法吗?我可以看出有区别,但是,根据我们数据的性质,结果应该是一样的。

ev7lccsx

ev7lccsx1#

这太长了,不能发表评论。
哪个更快取决于您的数据、数据模型和运行它的系统。因此,您应该在系统上测试这两个版本。
不过,总的来说 exists 可以在它遇到的符合条件的第一行停止。假设您有适当的索引,那么 join 应该是最小的。因为它可以更快地停止,所以有理由假设该版本比使用聚合的方法更快。聚合需要查找所有匹配项,因此即使只有一个匹配项,也需要不断查找所有匹配项以返回1的计数。

相关问题