Linq to SQL 查询以查找部分重复项

Linq to SQL query to find partial duplicates

我已经查看了很多关于 Linq to SQL 和重复的 SO 问题,但找不到任何可以引导我朝着适合我的情况的正确方向发展的问题。

我有一个视图,我想查询 return 仅具有相同 ColumnA 但不同 ColumnB 的行。

我的视图

我可以使用以下 T-SQL 查询获取 ColumnA 的所有值...

select
a.ColumnA, COUNT(*)
from 
(
    select
    b.ColumnA, b.ColumnB
    from MyView b
    group by b.ColumnA, b.ColumnB
) a
group by a.ColumnA
having count(*) > 1

..但如果可能的话,我想将 Linq 转换为 SQL 以及 return ID 列。

感谢任何帮助。

注意。 ASP.NET 4.0,C#,Linq to SQL,SQL 服务器正在使用中。

已更新

示例数据:

ID,ColumnA,ColumnB 1、AAA、A100 2、AAA、A100 3、AAA、B200 4、BBB、C300 5, BBB, C300

想要的结果:

ID,ColumnA,ColumnB 1、AAA、A100 2、AAA、A100 3, AAA, B200

(A列都一样,B列不一样。ID 4和5没有return因为ColumnB的值是一样的。)

已更新 2

我以某种方式创建了以下查询,它完成了我想要的部分操作,即 return 只是 ColumnA 值。非常感谢任何有关获取 ID 的改进或建议。

List<string> duplicates = (from a in
                               (from b in dc.MyTables
                                group b by new { b.ColumnA, b.ColumnB } into c
                                select new
                                {
                                    ColumnA = c.Key.ColumnA,
                                    ColumnB = c.Key.ColumnB
                                })
                           group a by a.ColumnA into d
                           where d.Count() > 1
                           select d.Key).ToList();

这样做 SQL 很棘手,因为您基本上是在要求将 ID 列表作为子组显示为 A 的每个值的一列。这不是真正的关系。可以使用著名的 XML 技巧来创建包含所有 ID 值的串联字符串。

然而,在 LINQ 中,您所要求的是相当简单的,因为您不限于平排。例如,您可以生成一个结果,其中第一个值是一个字符串,第二个是一个列表。因此,您可以生成一个结果,其中每个唯一的 ColumnA 是字段 1,字段 2 是 ID 列表。这可以通过使用 GroupBy Into 来完成。看看 LINQ 文档或示例,您应该可以毫无问题地将其适应您的数据。

为了回答我自己的问题,这似乎是我能想到的唯一解决方案...

var duplicates = (from z in dc.MyTables
                  where (from a in
                             (from b in dc.MyTables
                              group b by new { b.ColumnA, b.ColumnB } into c
                              select new
                              {
                                  ColumnA = c.Key.ColumnA,
                                  ColumnB = c.Key.ColumnB
                              })
                             group a by a.ColumnA into d
                             where d.Count() > 1
                             select d.Key).Contains(z.ColumnA)
                      orderby z.ColumnA ascending
                      select new
                      {
                          ID = z.ID,
                          ColumnA = z.CourseUrl2,
                          ColumnB = z.ColumnB
                      }).ToList();