我已经看过很多关于Linq to SQL和重复的SO问题,但是找不到任何能让我朝着正确的方向发展的东西。
我有一个视图,我想查询只返回具有相同ColumnA但不同ColumnB的行。
MyView的
我可以使用以下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();
答案 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();