Linq根据列中的重复值获取完整行

时间:2016-02-05 07:46:55

标签: c# linq

我正在寻找一个与我的数据表一起使用的LINQ,并根据windows form datagrid视图中的某些列显示所有重复的行。

LINQ应该给出类似于下面的普通旧的结果给SQL。

SELECT *
FROM Table1 t
JOIN (  SELECT Taskid, Studentid, DateChangeid
      FROM Table1
      GROUP BY Taskid, studentid, datechangeid
      HAVING COUNT(*) > 1) temp
  ON t.taskid = temp.taskid AND t.studentid= temp.studentid AND t.datechangeid= temp.datechangeid

2 个答案:

答案 0 :(得分:1)

这应该做你想要的:

var result = 
 t.GroupBy(g => new {TaskId = Taskid, StudentId = studentid, DatechangeId = datechangeid})
  .Where(g => g.Count > 1)
  .ToList();

现在您加入了Table1 Table1上不需要的内容,只需在Table1上进行过滤。

现在结果将是List<IGrouping<'a,Table1>>类型,但由于匿名键选择器,您还可以在类中定义TaskIdStudentIdDateChangeID来摆脱那。例如:

public class Table1GroupKey
{
   public int TaskId {get; set;}
   public int StudentId {get; set;}
   public int DateChangeId {get; set;}
}

然后你可以使用:

GroupBy(g => new Table1GroupKey { ... })

您的结果将是List<IGrouping<Table1GroupKey,Table1>>

答案 1 :(得分:0)

我通过编写下面给出的两个linq来管理它。

var RepeatedValues = from d in DataTableitems.AsEnumerable()
            group d by d.Field<string>("MobileNo") into itemGroup
            where itemGroup.Count() > 1
            select new { name = itemGroup.Key };

var RepeatedInRows= from d in DataTableitems.AsEnumerable()
              join c in RepeatedValues.AsEnumerable() on d.Field<string>
              ("MobileNo") equals c.name
              select d;