C# 我想在linq中使用Groupby和Left join打印计数
我有两个列表或表格,如下所示: 查询: 输出:C# 我想在linq中使用Groupby和Left join打印计数,c#,linq,lambda,C#,Linq,Lambda,我有两个列表或表格,如下所示: 查询: 输出: List A: User_Customer_ID Name =================================== 1 XYZ 2 ABC List B: User_Customer_ID RewardCount =================================== 1
List A:
User_Customer_ID Name
===================================
1 XYZ
2 ABC
List B:
User_Customer_ID RewardCount
===================================
1 5
查询:
var rewards = q.Join(
db.tbl_RewardAwardMast,
i => i.UserCustomer.User_Customer_ID,
j => j.fk_Customer_UserID,
(i, j) => new { Customer = i, Reward = j })
.Where(i => i.Reward.RewardDate >= i.Customer.UserCustomer.Membership_Start)
.GroupBy(i => i.Reward.fk_Customer_UserID)
.Select(i => new { CustomerID = i.Key, RewardCount = i.Count()})
.ToList();
var final = q.GroupJoin(
rewards,
i => i.UserCustomer.User_Customer_ID,
j => j.CustomerID,
(i, j) => new { Customer = i, Reward = j.DefaultIfEmpty() })
.Select(i => new { Count = i.Reward, id = i.Customer.UserCustomer.User_Customer_ID })
.ToList();
var final1 = final.Where(i => i.Count < m.MembershipMinVisit.Value).ToList();
输出:
List A:
User_Customer_ID Name
===================================
1 XYZ
2 ABC
List B:
User_Customer_ID RewardCount
===================================
1 5
这是最终的输出表
User_Customer_ID Name RewardCount
===============================================
1 XYZ 5
2 ABC 0
如果我想检查哪个用户\u客户\u ID的奖励计数少于5,我将如何检查:
查询:
var rewards = q.Join(
db.tbl_RewardAwardMast,
i => i.UserCustomer.User_Customer_ID,
j => j.fk_Customer_UserID,
(i, j) => new { Customer = i, Reward = j })
.Where(i => i.Reward.RewardDate >= i.Customer.UserCustomer.Membership_Start)
.GroupBy(i => i.Reward.fk_Customer_UserID)
.Select(i => new { CustomerID = i.Key, RewardCount = i.Count()})
.ToList();
var final = q.GroupJoin(
rewards,
i => i.UserCustomer.User_Customer_ID,
j => j.CustomerID,
(i, j) => new { Customer = i, Reward = j.DefaultIfEmpty() })
.Select(i => new { Count = i.Reward, id = i.Customer.UserCustomer.User_Customer_ID })
.ToList();
var final1 = final.Where(i => i.Count < m.MembershipMinVisit.Value).ToList();
var final=q.GroupJoin(
奖励,
i=>i.UserCustomer.User\u Customer\u ID,
j=>j.CustomerID,
(i,j)=>new{Customer=i,Reward=j.DefaultIfEmpty()})
.Select(i=>new{Count=i.Reward,id=i.Customer.UserCustomer.User\u Customer\u id})
.ToList();
var final1=final.Where(i=>i.Count
错误:
操作员“您不需要在此处加入团队,因为对于每个客户,您都需要一个结果(奖励)。另外,由于您只需要奖励小于5的客户,因此使用该条件的内部连接将为您提供您想要的:
var final = q.Join( // Join instead of GroupJoin
rewards.Where(r => r.RewardCount < 5), // filter out rewards >= 5
i => i.UserCustomer.User_Customer_ID,
j => j.CustomerID,
(i, j) => new { Customer = i, Reward = j })
.Select(i => new {
Reward = i.Reward, // 'Count' is a bad name
// it is still the reward object
id = i.Customer.UserCustomer.User_Customer_ID
})
.ToList();
您不需要在这里加入团队,因为对于每个客户,您都需要一个结果(奖励)。另外,由于您只需要奖励小于5的客户,因此使用该条件的内部连接将为您提供您想要的:
var final = q.Join( // Join instead of GroupJoin
rewards.Where(r => r.RewardCount < 5), // filter out rewards >= 5
i => i.UserCustomer.User_Customer_ID,
j => j.CustomerID,
(i, j) => new { Customer = i, Reward = j })
.Select(i => new {
Reward = i.Reward, // 'Count' is a bad name
// it is still the reward object
id = i.Customer.UserCustomer.User_Customer_ID
})
.ToList();
FirstOrDefault
在没有奖励时将为空。试图从中获取RewardCount
将导致NullReferenceException
。由于您首先使用的是left join,因此我假设您确实希望其中包含null值,因此您应该正确处理该情况。另外,顺便说一句,使用FirstOrDefault
可能是个坏主意。我删除了FirstOrDefault并尝试了另一种方法,但得到了不同的错误。@Luaan实际上DefaultIfEmpty
将导致奖励
不是空的,但可能包含一个null
值。我只想比较两个值,并希望得到小于5个值的最终结果。停止猜测。你需要了解代码在做什么,否则你只是在随机尝试解决方案,希望其中一个能起作用。FirstOrDefault
在没有奖励时会给你空值。试图从中获取RewardCount
将导致NullReferenceException
。由于您首先使用的是left join,因此我假设您确实希望其中包含null值,因此您应该正确处理该情况。另外,顺便说一句,使用FirstOrDefault
可能是个坏主意。我删除了FirstOrDefault并尝试了另一种方法,但得到了不同的错误。@Luaan实际上DefaultIfEmpty
将导致奖励
不是空的,但可能包含一个null
值。我只想比较两个值,并希望得到小于5个值的最终结果。停止猜测。你需要理解代码在做什么,否则你只是在随机尝试解决方案,希望其中一个能起作用。