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
相关产品推荐
相关产品推荐

