LINQ多表左联接,不同计数未给出正确结果
我正在用sql查询我们生成正确的结果,但是当我在LINQ中执行同样的操作时。输出不正确。请让我知道我在哪里犯错 下面是我创建的linq查询 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
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
- 林克:
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)
和LINQCOUNT
之间的区别在于前者排除了NULL
值,当在没有匹配记录的左侧外部联接的右侧使用时,会产生差异(SQL将生成0
,而LINQ1
)。最接近的LINQ等价物是计数(expr!=null)
因此,SQL查询的直接转换如下所示(请注意,生成的SQL查询可以而且很可能会有所不同):
(旁注:将SQL查询转换为LINQ时,最好使用相同的别名,以便于查看映射)
SQL
COUNT(expr)
和LINQCOUNT
之间的区别在于前者排除了NULL
值,当在没有匹配记录的左侧外部联接的右侧使用时,会产生差异(SQL将生成0
,而LINQ1
)。最接近的LINQ等价物是计数(expr!=null)
因此,SQL查询的直接转换如下所示(请注意,生成的SQL查询可以而且很可能会有所不同):
(旁注:将SQL查询转换为LINQ时,最好使用相同的别名,以便于查看映射)
那个sql查询给出了正确的结果……根据那个参考答案,请解释一下你们得到了什么,你们没有预料到的。一些示例数据和预期的输出将有助于我的sql查询是否正确,以便plz将其转换为linqIs这个LINQ to实体?请相应地更新标签/帖子,即实体框架、版本等。sql查询给出的结果很快就正确了……根据该参考,请回答。请解释您得到了哪些您不期望的结果。一些示例数据和预期的输出将有助于我的sql查询是否正确,以便plz将其转换为linqIs这个LINQ to实体?请相应地更新标签/帖子,即实体框架、版本等@Gaurry-然后请再次按照上述要求解释您的数据、您得到的信息、您的期望。当你说“不工作”时,你必须解释这意味着什么…@Gaurry-然后,请再次按照上面的要求解释你的数据是什么,你得到了什么,你期望什么。当你说“不工作”时,你必须解释这意味着什么……哦,很好,忘记了空左连接的计数:)好的,哦,很好,忘记了空左连接的计数:)好的