【问题标题】:Linq query has a bug?Linq 查询有错误?
【发布时间】:2018-05-28 14:33:28
【问题描述】:

只需查看 linq 查询和 SQL 分析器生成的查询。 Linq 重复它不应该的子查询。这是一个错误还是我做错了什么?顺便说一句,我知道如何编写这个 linq 来给我一个满意的结果,但我想知道为什么这个 linq 解释不好?

        return (from k in ctx.UzajamnaKasa
                join p in ctx.UzajamnaKasaPozajmice
                    on k.UzajamnaKasaId equals p.UzajamnaKasaId
                where k.ClanId == clanId
                select p.Iznos + p.Donos -
                    (from ot in ctx.UzajamnaKasaPozajmiceOtplate
                     where p.PozajmicaId == ot.PozajmicaId
                     group ot.Iznos by ot.PozajmicaId into g
                     select g.Sum()).FirstOrDefault()
                ).Sum();



select [GroupBy3].[A1] as [C1]
from
(
    select sum([Project2].[A1]) as [A1]
    from
    (
        select ([Project2].[Iznos] + [Project2].[Donos])
               - (case
                      when ([Project2].[C1] is null) then
                          cast(0 as decimal(18))
                      else
                  (
                      select top (1)
                             [GroupBy2].[A1] as [C1]
                      from
                      (
                          select [Extent4].[PozajmicaId] as [K1]
                               , sum([Extent4].[Iznos])  as [A1]
                          from [dbo].[UzajamnaKasaPozajmiceOtplate] as [Extent4]
                          where [Project2].[PozajmicaId] = [Extent4].[PozajmicaId]
                          group by [Extent4].[PozajmicaId]
                      ) as [GroupBy2]
                  )
                  end
                 ) as [A1]
        from
        (
            select [Extent2].[PozajmicaId] as [PozajmicaId]
                 , [Extent2].[Iznos]       as [Iznos]
                 , [Extent2].[Donos]       as [Donos]
                 , (
                       select top (1)
                              [GroupBy1].[A1] as [C1]
                       from
                       (
                           select [Extent3].[PozajmicaId] as [K1]
                                , sum([Extent3].[Iznos])  as [A1]
                           from [dbo].[UzajamnaKasaPozajmiceOtplate] as [Extent3]
                           where [Extent2].[PozajmicaId] = [Extent3].[PozajmicaId]
                           group by [Extent3].[PozajmicaId]
                       ) as [GroupBy1]
                   )                       as [C1]
            from [dbo].[UzajamnaKasa]                    as [Extent1]
                inner join [dbo].[UzajamnaKasaPozajmice] as [Extent2]
                    on [Extent1].[UzajamnaKasaId] = [Extent2].[UzajamnaKasaId]
            where [Extent1].[ClanId] = 1303
        ) as [Project2]
    ) as [Project2]
) as [GroupBy3];

他为什么要复制这个选择?这对性能很不利。:

 select top (1)
                             [GroupBy2].[A1] as [C1]
                      from
                      (
                          select [Extent4].[PozajmicaId] as [K1]
                               , sum([Extent4].[Iznos])  as [A1]
                          from [dbo].[UzajamnaKasaPozajmiceOtplate] as [Extent4]
                          where [Project2].[PozajmicaId] = [Extent4].[PozajmicaId]
                          group by [Extent4].[PozajmicaId]
                      ) as [GroupBy2]

【问题讨论】:

  • 如果高效的查询很重要,那么永远不要依赖任何框架或库来为您编写查询。自己写吧。即使你现在让它工作,在更新框架后它可能会再次变得糟糕......
  • 我们可以假设查询优化器将删除代码中不必要的部分。查询执行计划显示什么?
  • 它在 UzajamnaKasaPozajmiceOtplate.PozajmicaId 上显示了两次索引搜索。

标签: c# sql-server linq entity-framework-6


【解决方案1】:
                    (from ot in ctx.UzajamnaKasaPozajmiceOtplate
                 where p.PozajmicaId == ot.PozajmicaId
                 group ot.Iznos by ot.PozajmicaId into g
                 select g.Sum()).FirstOrDefault()

由于 FirstOrDefault(),这个子查询将为每个创建的 p.PozajmicaId 执行。

【讨论】:

  • 嗯,这就是我想要的结果,我得到了最终的总和。问题是他为什么要复制这段代码“select top (1) [GroupBy2].[A1] as [C1] ...”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多