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

LINQ关联两张表查询出现重复值,需获取去重后的预期结果

解决LINQ关联查询重复结果的问题

嗨,这个问题很常见——因为你的Transaction表中同一个OrderID对应多条交易记录,内连接后自然会把每个匹配的交易都返回,所以才会出现重复的客户-订单组合。咱们来优化一下查询逻辑,轻松得到去重后的结果:

方案一:先对Transaction表按OrderID去重(兼容所有.NET版本)

这种方法先处理Transaction集合,提取每个OrderID对应的唯一商店名称(假设同一OrderID的StoreName是一致的,就像你例子里那样),再和Customer表关联,从根源避免重复。

修改后的完整代码:

using System;
using System.Linq;
using System.Collections.Generic;

public class Program {
    public static void Main() {
        // Customer collection
        IList<Customer> CustomertList = new List<Customer>() {
            new Customer() { CustomerID = 1, CustomerName = "John", OrderID = 4 } ,
            new Customer() { CustomerID = 2, CustomerName = "Moin", OrderID = 7 } ,
        };
        // Transaction collection
        IList<Transaction> TransactionList = new List<Transaction>() {
            new Transaction() { TransactionID = 1, OrderID = 4, Purchased = "TV",StoreName ="Amazon"} ,
            new Transaction() { TransactionID = 2, OrderID = 7, Purchased = "Laptop",StoreName ="Ebay"} ,
            new Transaction() { TransactionID = 3, OrderID = 7, Purchased = "Mobile",StoreName ="Ebay"} ,
        };

        // 先对Transaction按OrderID分组,获取每个订单对应的唯一商店名称
        var uniqueOrderStores = TransactionList
            .GroupBy(t => t.OrderID)
            .Select(g => new { OrderID = g.Key, StoreName = g.First().StoreName });

        // LINQ关联查询
        var result = (from cus in CustomertList
                      join tran in uniqueOrderStores on cus.OrderID equals tran.OrderID
                      select new {
                          CustomerName = cus.CustomerName,
                          OrderID = cus.OrderID,
                          StoreName = tran.StoreName
                      }).ToList();

        foreach(var item in result){
            Console.WriteLine( "Name - {0} , Order ID - {1} , StoreName - {2}",item.CustomerName , item.OrderID,item.StoreName);
        }
    }
}

public class Customer {
    public int CustomerID { get; set; }
    public string CustomerName { get; set; }
    public int OrderID { get; set; }
}

public class Transaction {
    public int TransactionID { get; set; }
    public int OrderID { get; set; }
    public string Purchased { get; set; }
    public string StoreName { get; set; }
}

执行后得到预期结果:

Name - John , Order ID - 4 , StoreName - Amazon
Name - Moin , Order ID - 7 , StoreName - Ebay

方案二:使用DistinctBy简化代码(.NET 6+适用)

如果你的项目基于.NET 6或更高版本,可以直接利用LINQ新增的DistinctBy方法,在原查询结果中按客户名称+订单ID去重,代码更简洁:

// 替换原查询部分即可
var result = (from Cus in CustomertList
              join TRan in TransactionList on Cus.OrderID equals TRan.OrderID
              select new {
                  CustomerName = Cus.CustomerName,
                  OrderID = Cus.OrderID,
                  StoreName = TRan.StoreName
              }).DistinctBy(x => new { x.CustomerName, x.OrderID }).ToList();

这个方法会自动过滤掉重复的客户-订单组合,同样能得到你想要的去重结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:43:13