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

ASP MVC C# LINQ:如何按CustomerID分组去重下拉列表客户数据?

解决客户列表重复问题

你可以通过以下几种方式实现按客户ID去重,避免下拉列表中重复显示客户名称:

方法1:先筛选符合条件的客户ID,再关联地址表(推荐,性能更优)

先从订单表中提取所有有样品订单的客户ID并去重,再用这些ID查询对应的客户信息,能避免关联时产生重复数据:

protected void FetchCustomerList()
{
    // 先获取所有有样品订单的客户ID,去重
    var validCustomerIds = _stockEntities.tblOrders
        .Where(o => o.Sample != 0)
        .Select(o => o.CustomerID)
        .Distinct();

    // 根据筛选后的ID查询客户信息并排序
    ViewData["Customers"] = _stockEntities.tblAddresses
        .Where(c => validCustomerIds.Contains(c.AddressID))
        .OrderBy(c => c.AName);
}

方法2:使用GroupBy分组取唯一客户

通过按客户的AddressID分组,然后取每组的第一条记录,也能实现去重:

protected void FetchCustomerList()
{
    ViewData["Customers"] = (from c in _stockEntities.tblAddresses
                             join orders in _stockEntities.tblOrders on c.AddressID equals orders.CustomerID
                             where orders.Sample != 0
                             // 按客户ID分组
                             group c by c.AddressID into customerGroup
                             // 取每组的第一个客户记录
                             select customerGroup.First())
                             .OrderBy(c => c.AName);
}

方法3:直接使用Distinct()(需注意实体相等性)

如果你的tblAddresses实体正确重写了Equals和GetHashCode方法(以AddressID作为判断相等的依据),可以直接在查询末尾添加Distinct():

protected void FetchCustomerList()
{
    ViewData["Customers"] = (from c in _stockEntities.tblAddresses
                             join orders in _stockEntities.tblOrders on c.AddressID equals orders.CustomerID
                             where orders.Sample != 0
                             orderby c.AName
                             select c)
                             .Distinct();
}

注意:如果实体没有重写相等方法,Distinct()可能无法正确去重,这时候更推荐前两种方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:45:39