【问题标题】:Linq query generates different result in SQLLinq 查询在 SQL 中生成不同的结果
【发布时间】:2020-05-27 05:57:34
【问题描述】:

我在 LINQ 中编写了这个左连接,我只从 SHPerson 表中选择了 PersonId,但在 SQL Server 分析器中,我也从 SHPFA 表中获得了 PersonId

 var spfQuery = from n in shHPFARepository.GetAll()
                                      .AsNoTracking()
                                      .Where(t => t.ShareCount > 0)
                group n by new { n.PersonId } into nGroup
                select new 
                { 
                    nGroup.Key.PersonId, 
                    TotalhareCount = nGroup.Sum(t => t.ShareCount) 
                };                                                                                       

 var query = (from sp in SHPersonRepository.GetAll().AsNoTracking()
              join spf in spfQuery on sp.Id equals spf.PersonId 
              select new SHPOutputDto
             {
                 PersonId = sp.PersonId,
                 ShareCount = spf.TotalShareCount,
                 IsShareHolder=true
             });

var resultDto = await query.ToListAsync();

我不希望在查询中选择 SHPFA.PersonId ([t0].[PersonId])。

SELECT [t0].[PersonId], [t0].[TotalShareCount], [e].[PersonId]
FROM [SHolders].[SHPerson] AS [e]
INNER JOIN 
    (SELECT [t].[SHPersonId], SUM([t].[ShareCount]) AS [TotalShareCount]
     FROM [SHolders].[SHPFA] AS [t]
     WHERE [t].[ShareCount] > 0
     GROUP BY [t].[PersonId]) AS [t0] ON [e].[Id] = [t0].[PersonId]

【问题讨论】:

    标签: c# linq linq-to-sql left-join sql-server-profiler


    【解决方案1】:

    您是要从子选择内连接中删除它还是要从最终选择结果中删除它?因为似乎您正在使用两个相似的列 [PersonId][SHPersonId]

    如果这只是一个错字,那么您应该在第一个查询中使用[SHPersonId],如下所示:

    var spfQuery = from n in shHPFARepository.GetAll()
                                      .AsNoTracking()
                                      .Where(t => t.ShareCount > 0)
                group n by n.SHPersonId into nGroup
                select new 
                { 
                    SHPersonId = nGroup.Key, 
                    TotalhareCount = nGroup.Sum(t => t.ShareCount) 
                };               
    

    P.S.:不要忘记通过将PersonId 重命名为SHPersonId 来修改第二个查询

    【讨论】:

    • 我想从最终选择结果中删除 [t0].[PersonId]
    • 您是否尝试从最终查询select new SHPOutputDto 中删除PersonId = sp.PersonId 行?我有一种感觉,我们彼此误会了……
    • 没有。 SHPOutputDto 是我想在输出中看到的,但我在 SQL Server 分析器中得到了两个 PersonId,第一个 PersonId 用于 SHPFA 表([t0].[PersonId]),第二个 PersonId 用于 SHPerson 表([e] .[PersonId])。我不想选择第一个 PersonId([t0].[PersonId])。
    • 明白了!我能够理解真正的问题...... :D 这个问题似乎是一个 SQL 分析器错误。也许这个问题与 EDMX 有关。您可以尝试删除和读取 EDMX 中的表格吗?我知道这并不容易,但值得一试!
    【解决方案2】:

    您也可以随时使用raw sql query

    using (var ctx = new YourContext())
    {
    
        var spfQuery = ctx.Database.SqlQuery<YourModel>("SELECT
             [t0].[TotalShareCount]
           , [e].[PersonId]
           FROM [SHolders].[SHPerson] AS [e]
           INNER JOIN 
              (SELECT [t].[SHPersonId], SUM([t].[ShareCount]) AS [TotalShareCount]
               FROM [SHolders].[SHPFA] AS [t]
               WHERE [t].[ShareCount] > 0
               GROUP BY [t].[PersonId]) AS [t0] ON [e].[Id] = [t0].[PersonId]"
        ).ToList();
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2010-09-21
      • 2017-04-06
      相关资源
      最近更新 更多