如何用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去重的原理
- 使用匿名类型作为分组键:匿名类型会自动重写
Equals和GetHashCode方法,基于其包含的所有属性值进行比较,确保属性完全一致的行被分到同一组。 - 从分组中取单一行:每个分组代表一组重复的行,通过
group.First()取出分组内任意一个实例,即可得到去重后的唯一行。
内容的提问来源于stack exchange,提问作者ahmed elbarbary
相关产品推荐
相关产品推荐

