LINQ多表左联接,不同计数未给出正确结果

LINQ多表左联接,不同计数未给出正确结果,linq,Linq,我正在用sql查询我们生成正确的结果,但是当我在LINQ中执行同样的操作时。输出不正确。请让我知道我在哪里犯错 下面是我创建的linq查询 LINQ查询: List<UserModel> Model = (from users in db.UserM join ct in db.CustT on users.UserId equals ct.UserID into group1 from g1 in

我正在用sql查询我们生成正确的结果,但是当我在LINQ中执行同样的操作时。输出不正确。请让我知道我在哪里犯错

下面是我创建的linq查询

LINQ查询:

List<UserModel> Model = (from users in db.UserM
                     join ct in db.CustT on users.UserId equals ct.UserID into group1
                     from g1 in group1.DefaultIfEmpty()
                     join ti in db.TestIn on  g1.TestId equals ti.TestID into group2
                     from g2 in group2.DefaultIfEmpty()
                     where (users.CustomerId==CustomerId) && (users.RoleId == 4) && (users.Status == 1)
                     group new
                     {
                         g2.TestInvitationID,
                         g2.TestID,
                     }
                     by new
                     {
                         users.FirstName,
                         users.CreatedOn,
                         users.Email,
                         users.UserId
                     } into group4

                     select new UserModel
                     {
                         Name =  group4.Key.FirstName,
                         CreatedOn = group4.Key.CreatedOn,
                         EmailId = group4.Key.Email,
                         UserId = group4.Key.UserId,
                         NoOfTestTaken = group4.Select(x=>x.TestID).Distinct().Count(),
                         NoOfInvitationsSent = group4.Count(x => x.TestInvitationID != 0)
                     }).ToList();
表:

  • “UserM”-列:UserId、Email、FirstName、CreatedOn
  • “CustT”-列:TestId、UserId、
  • “TestIn”-列:TestInvitationId、TestId

我怀疑以下行是问题所在,因为它与sql中的不同:

  • 林克:

    NoOfInvitationsSent = group4.Count(x => x.TestInvitationID != 0)
    
  • SQL:

    IsNull(COUNT(TS.TestInvitationID),0) AS NoOfInvitations
    
  • 由于从左连接计数项目,Linq应改为:

    NoOfInvitationsSent = group4.Where(i => i != null).Count()
    
要将所有内容放在一起,再加上一些更好的格式:

var model = (from users in db.UserMasters
             join ct in db.CustTests on users.UserId equals ct.UserID into group1
             from ct in group1.DefaultIfEmpty()
             join ti in db.TestInvitaions on  ct.TestId equals ti.TestID into group2
             from ct in group2.DefaultIfEmpty()

             where users.CustomerId == UserSession.CustomerId && 
                   users.RoleId == 4 && 
                   users.Status == 1

             group new { ct.TestInvitationID, ct.TestID }
             by new
             {
                 users.FirstName,
                 users.CreatedOn,
                 users.Email,
                 users.UserId
             } into grouping

             select new UserModel
             {
                 Name =  grouping.Key.FirstName,
                 CreatedOn = grouping.Key.CreatedOn,
                 EmailId = grouping.Key.Email,
                 UserId = grouping.Key.UserId,
                 NoOfTestTaken = grouping.Where(i => i != null).Select(x => x.TestID).Distinct().Count(),
                 NoOfInvitationsSent = grouping.Where(i => i != null).Count()
             }).ToList();

我怀疑以下行是问题所在,因为它与sql中的不同:

  • 林克:

    NoOfInvitationsSent = group4.Count(x => x.TestInvitationID != 0)
    
  • SQL:

    IsNull(COUNT(TS.TestInvitationID),0) AS NoOfInvitations
    
  • 由于从左连接计数项目,Linq应改为:

    NoOfInvitationsSent = group4.Where(i => i != null).Count()
    
要将所有内容放在一起,再加上一些更好的格式:

var model = (from users in db.UserMasters
             join ct in db.CustTests on users.UserId equals ct.UserID into group1
             from ct in group1.DefaultIfEmpty()
             join ti in db.TestInvitaions on  ct.TestId equals ti.TestID into group2
             from ct in group2.DefaultIfEmpty()

             where users.CustomerId == UserSession.CustomerId && 
                   users.RoleId == 4 && 
                   users.Status == 1

             group new { ct.TestInvitationID, ct.TestID }
             by new
             {
                 users.FirstName,
                 users.CreatedOn,
                 users.Email,
                 users.UserId
             } into grouping

             select new UserModel
             {
                 Name =  grouping.Key.FirstName,
                 CreatedOn = grouping.Key.CreatedOn,
                 EmailId = grouping.Key.Email,
                 UserId = grouping.Key.UserId,
                 NoOfTestTaken = grouping.Where(i => i != null).Select(x => x.TestID).Distinct().Count(),
                 NoOfInvitationsSent = grouping.Where(i => i != null).Count()
             }).ToList();

SQL
COUNT(expr)
和LINQ
COUNT
之间的区别在于前者排除了
NULL
值,当在没有匹配记录的左侧外部联接的右侧使用时,会产生差异(SQL将生成
0
,而LINQ
1
)。最接近的LINQ等价物是
计数(expr!=null)

因此,SQL查询的直接转换如下所示(请注意,生成的SQL查询可以而且很可能会有所不同):

(旁注:将SQL查询转换为LINQ时,最好使用相同的别名,以便于查看映射)


SQL
COUNT(expr)
和LINQ
COUNT
之间的区别在于前者排除了
NULL
值,当在没有匹配记录的左侧外部联接的右侧使用时,会产生差异(SQL将生成
0
,而LINQ
1
)。最接近的LINQ等价物是
计数(expr!=null)

因此,SQL查询的直接转换如下所示(请注意,生成的SQL查询可以而且很可能会有所不同):

(旁注:将SQL查询转换为LINQ时,最好使用相同的别名,以便于查看映射)


那个sql查询给出了正确的结果……根据那个参考答案,请解释一下你们得到了什么,你们没有预料到的。一些示例数据和预期的输出将有助于我的sql查询是否正确,以便plz将其转换为linqIs这个LINQ to实体?请相应地更新标签/帖子,即实体框架、版本等。sql查询给出的结果很快就正确了……根据该参考,请回答。请解释您得到了哪些您不期望的结果。一些示例数据和预期的输出将有助于我的sql查询是否正确,以便plz将其转换为linqIs这个LINQ to实体?请相应地更新标签/帖子,即实体框架、版本等@Gaurry-然后请再次按照上述要求解释您的数据、您得到的信息、您的期望。当你说“不工作”时,你必须解释这意味着什么…@Gaurry-然后,请再次按照上面的要求解释你的数据是什么,你得到了什么,你期望什么。当你说“不工作”时,你必须解释这意味着什么……哦,很好,忘记了空左连接的计数:)好的,哦,很好,忘记了空左连接的计数:)好的