LINQ和SQL查询帮助:如何对两个列同时进行去重?

3

如何使用SELECT语句获取基于FromLinkIDToLinkID组合的DISTINCT结果?

如果我有一个包含以下数据的List,我该如何在LINQ中获取我想要的内容?

alt text


1
你期望以上数据的输出结果是什么? - Ash Burlaczenko
为什么要使用 sqllinq:你想要一个 LINQ 查询还是 SQL 语句? - p.campbell
6个回答

2
SELECT  DISTINCT FromLinkId, ToLinkId
FROM    mytable

为了选择每个(FromLinkId, ToLinkId)的一条记录(使用最小的id),假设使用SQL Server

SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY FromLinkId, ToLinkId ORDER BY id) AS rn
        FROM    mytable
        ) q
WHERE   rn = 1

1
天啊 :) 当然可以 - 但我能在 select 中显示其他列吗?对于其他列,它会显示哪一个(如果使用了 distinct)? - VoodooChild
@VoodooChild:你决定选哪一个,我会为你编写查询语句 :) - Quassnoi
@Quassnoi:很好,那真是太棒了。但是我在你的查询中没有看到“DISTINCT”关键字,我假设“PARTITION BY”可以达到同样的效果?我猜“GROUP BY”也是差不多的东西? - VoodooChild
@Voodoo:是的,还有 WHERE rn = 1 - Quassnoi
@Quassnoi:感谢您的帮助,我发布了一个LINQ答案,它实现了我想要的功能。 - VoodooChild
显示剩余3条评论

0

试试这个:

Select Distinct FromLinkId LinkId From MyTable 
Union 
Select Distinct ToLinkId LinkId From MyTable 

先生,这个不起作用。它给我问题中示例数据的两行。 - VoodooChild
@Voodoo,这是你从所有FromLinkId和ToLinkId值的组合集中获取一组不同值所需的内容。看起来你实际上想要不同的(FromLinkId, ToLinkId)值的一组不同的对或元组,这种情况下Quassnoi的答案就是你想要的SQL。 - Charles Bretana

0
SELECT Name, FromLinkId, ToLinkId FROM MyTable GROUP BY FromLinkId, ToLinkId -- if there are more than one record with the same (FromLinkId, ToLinkId) pair, only one of them is displayed.

0

你可以这样做:

SELECT MAX(ID), MAX(Name), FromLinkID, ToLinkID FROM MyTable 
GROUP BY FromLinkID, ToLinkID

甚至可以这样写:
SELECT t.* FROM
(SELECT MAX(ID) as MaxID, FromLinkID, ToLinkID FROM MyTable  
GROUP BY FromLinkID, ToLinkID) d 
LEFT JOIN MyTable t ON d.MaxID=t.ID

0

LINQ解决方案:

List<MyObj> distinctResults = allResults
  .GroupBy(p => new {p.FromLinkID, p.ToLinkID} )
  .Select(g => g.First())
  .ToList();

希望能对某些人有所帮助。

相关的SO问题很有帮助。


0

列表 distinctResults = allResults .Select(p => new {p.FromLinkID, p.ToLinkID} ) .Distinct() .ToList();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接