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

如何用Group By替代Distinct获取ASP.NET Razor页面唯一行?

用GroupBy替代Distinct解决LINQ to SQL去重问题

直接替换原代码中的Distinct()为基于视图模型所有属性的分组逻辑即可,修改后的方法如下:

public List<AssetLPOvm> GetAllLpoDetails(string SelectedCompany)
{    
    var AssetBranches = _unitOFWorkAsset.AssetBranches.GetList(x => x.CompanyNo == SelectedCompany && Convert.ToInt32(x.UserID) > 0 );        
    var NewAssetTagging = _unitOFWorkAsset.NewAssetTagging.GetList(x => x.LPONo > 0);

    var result = (from assetBranch in AssetBranches
                  join user in Users on assetBranch.UserID equals user.UserID
                  join assetTagging in NewAssetTagging on Convert.ToDecimal(assetBranch.LPONO) equals assetTagging.LPONo
                  select new AssetLPOvm
                  {
                      AssetItemNo = assetBranch.AssetItemNo,
                      SupplierName = assetTagging.SupplierName,
                      SelectedMCUName = assetBranch.SelectedMCUName,
                      AssetOwner = assetBranch.AssetOwner,
                      ItemCode = assetBranch.ItemCode,
                      Qty = assetBranch.Qty,
                      LPONO = assetBranch.LPONO
                  })
                  // 按AssetLPOvm的所有属性分组,确保相同属性值的行被归为一组
                  .GroupBy(asset => new 
                  {
                      asset.LPONO,
                      asset.AssetItemNo,
                      asset.SupplierName,
                      asset.SelectedMCUName,
                      asset.AssetOwner,
                      asset.Qty,
                      asset.ItemCode
                  })
                  // 从每个分组中取任意一行(这里取第一行)
                  .Select(group => group.First())
                  .ToList();

    return result;
}

为什么原Distinct不生效?

AssetLPOvm是自定义引用类型,默认的Distinct()方法比较的是对象的引用地址,而非属性值。即使两个AssetLPOvm实例的所有属性完全一致,它们也是不同的对象实例,因此Distinct()无法识别为重复项。

GroupBy去重的原理

  1. 使用匿名类型作为分组键:匿名类型会自动重写Equals和GetHashCode方法,基于其包含的所有属性值进行比较,确保属性完全一致的行被分到同一组。
  2. 从分组中取单一行:每个分组代表一组重复的行,通过group.First()取出分组内任意一个实例,即可得到去重后的唯一行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:09:58