【问题标题】:Self JOIN query using EF-Core使用 EF-Core 进行自 JOIN 查询
【发布时间】:2020-06-08 09:14:26
【问题描述】:

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

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 相比,这是一种更有效的方法吗?我可以看到存在差异,但是根据我们数据的性质,结果应该是相同的。

【问题讨论】:

    标签: c# sql ef-core-3.1


    【解决方案1】:

    评论太长了。

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2014-03-13
      • 2021-10-22
      • 1970-01-01
      • 2020-02-18
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      相关资源
      最近更新 更多