Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我想在linq中使用Groupby和Left join打印计数_C#_Linq_Lambda - Fatal编程技术网

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个值的最终结果。停止猜测。你需要理解代码在做什么,否则你只是在随机尝试解决方案,希望其中一个能起作用。