【问题标题】:Getting DISTINCT values from a JOIN从 JOIN 中获取 DISTINCT 值
【发布时间】:2013-02-08 17:08:20
【问题描述】:

我目前有以下 LINQ 语句:

using (MYEntities ctx = CommonMY.GetMYContext())
{
    List<datUser> lstC = (from cObj in ctx.datUser 
                          join fs in ctx.datFS on cObj.UserID equals fs.datUser.UserID 
                          where userOrg.Contains(fs.userOrg.OrgName)
                          select cObj).ToList();

    foreach (datUser c in lstC)
    {
        Claim x = new Claim
        {
            UserID= c.userID,
            FirstName = c.FirstName,
            LastName = c.LastName,
            MiddleName = c.MiddleName,
        };
    }
}

现在它返回所有用户,但如果他们有超过 1 个组织与他们关联,它会复制他们。 如何确保它只返回不同的 UserID?

每个用户可以有多个组织,但我真的只需要从 userOrg 列表中返回至少有 1 个组织的用户。

【问题讨论】:

    标签: c# linq join distinct


    【解决方案1】:

    就在您的 ToList 之前,输入 .Distinct()

    为了响应@DJ BURB,您可能应该使用接收 IEqualityComparer 的 Distinct 重载,以最好地确保您根据每条记录的唯一 ID 执行此操作。

    this blog post 为例。

    【讨论】:

    • 他们不需要指定需要区分的值吗?
    • 在您的自定义比较器的Equals() 方法中(它应该接受cObj 以上类型的2 个变量)只需比较您想要确保它们不同的任何值。
    • 对不起,什么 Equals() 方法?这是我需要补充的吗?还是您的意思是连接语句中的等号?
    • 我的意思是在自定义比较器中,您可以将其放入 Distinct 方法的重载中。查看答案中的博文了解更多详情。
    【解决方案2】:

    使用分组依据。

    语法:

    var result= from p in <any collection> group p by p.<property/attribute> into grps
                 select new 
                 {
                   Key=grps.Key,
                   Value=grps
                 } 
    

    【讨论】:

    • 所以我不需要选择 cObj).ToList();?
    • 如果您希望最终结果是这样的话,您仍然需要将整个内容包装在 (var result ..{}).ToList() 中
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多