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

时间:2015-06-03 01:11:22

标签: c# tsql linq-to-sql

我已经看过很多关于Linq to SQL和重复的SO问题,但是找不到任何能让我朝着正确的方向发展的东西。

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

MyView的

  • ID
  • 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并返回ID列。

任何帮助表示感谢。

NB。 ASP.NET 4.0,C#,Linq to SQL,SQL Server正在使用中。

已更新

示例数据:

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都相同,但ColumnB不同。由于ColumnB值相同,因此不返回ID 4和5.)

更新2

不知何故,我创建了以下查询,该查询执行了我想要的部分,只返回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();

2 个答案:

答案 0 :(得分:0)

执行此操作是非常棘手的,因为您基本上要求将ID列表作为子组显示为A的每个值的一列。这不是真正的关系。可以使用着名的XML技巧来创建一个包含所有ID值的连接字符串。

然而在LINQ中你要求的是相当容易的,因为你不仅限于平行。您可以生成第一个值为字符串的结果,第二个值为List。因此,您可以生成一个结果,其中每个唯一ColumnA为字段1,而字段2为ID列表。这可以通过使用GroupBy Into来完成。查看LINQ文档或示例,您可以毫无困难地将其与数据相匹配。

答案 1 :(得分:0)

要回答我自己的问题,这似乎是我能提出的唯一解决方案......

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();