Linq to SQL 查询以查找部分重复项
Linq to SQL query to find partial duplicates
我已经查看了很多关于 Linq to SQL 和重复的 SO 问题,但找不到任何可以引导我朝着适合我的情况的正确方向发展的问题。
我有一个视图,我想查询 return 仅具有相同 ColumnA 但不同 ColumnB 的行。
我的视图
- ID
- A 列
- B 列
我可以使用以下 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();
我已经查看了很多关于 Linq to SQL 和重复的 SO 问题,但找不到任何可以引导我朝着适合我的情况的正确方向发展的问题。
我有一个视图,我想查询 return 仅具有相同 ColumnA 但不同 ColumnB 的行。
我的视图
- ID
- A 列
- B 列
我可以使用以下 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();