You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C# EF或SQL实现含反转列的去重查询?

问题描述

需要查询名为Trips的表,要求查询结果既包含原表的FROM和TO列数据,也要包含这两列值互换的行,随后去除所有顺序相同的重复项(即相同城市按相同顺序出现视为重复)。

示例数据

Trips表:

FROM                 TO
-------------------- --------------------
West Jordan          Taylorsville
Salt Lake City       Ogden
West Jordan          Taylorsville
Sandy                South Jordan
Taylorsville         West Jordan

期望结果

West Jordan          Taylorsville
Taylorsville         West Jordan
Salt Lake City       Ogden
Ogden                Salt Lake City
Sandy                South Jordan
South Jordan         Sandy

希望用C#和Entity Framework实现,也可使用原生SQL,询问能否通过查询实现,还是需要手动处理部分逻辑?

解决方案

完全可以通过查询实现,不需要手动处理重复或互换逻辑,以下是两种实现方式:

原生SQL实现

使用UNION ALL合并原数据与互换列的数据,再通过DISTINCT去重:

SELECT DISTINCT t."FROM", t."TO"
FROM Trips t
UNION ALL
SELECT DISTINCT t."TO", t."FROM"
FROM Trips t
ORDER BY "FROM", "TO";
  • 第一部分查询原表的FROM和TO列
  • 第二部分查询互换TO和FROM后的列
  • UNION ALL保留所有合并结果,外层DISTINCT自动剔除顺序相同的重复行
  • 最后按FROM、TO排序,与示例结果匹配

Entity Framework 实现(C#)

通过Concat合并两个查询集,再用Distinct去重:

首先定义对应Trips表的实体类:

public class Trip
{
    public string From { get; set; }
    public string To { get; set; }
}

查询代码:

// 获取原表所有行
var originalTrips = dbContext.Trips.Select(t => new { From = t.From, To = t.To });
// 获取互换From和To后的行
var reversedTrips = dbContext.Trips.Select(t => new { From = t.To, To = t.From });

// 合并、去重并排序
var finalResult = originalTrips
    .Concat(reversedTrips)
    .Distinct()
    .OrderBy(r => r.From)
    .ThenBy(r => r.To)
    .ToList();
  • Concat用于合并两个查询结果集
  • Distinct会基于匿名类的属性值自动去重顺序相同的行
  • 排序后得到与示例一致的结果

如果处理大数据量,原生SQL的性能更优;EF写法更贴合ORM使用习惯,代码可读性更强。

内容的提问来源于stack exchange,提问作者Jonathan Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:06:22