对于我的查询c# linq, Distinct不工作

本文关键字:linq Distinct 工作 查询 于我的 我的 | 更新日期: 2023-09-27 18:03:34

如你所见,我有这样的查询:

 public IQueryable<ViewReportMaterialRequestContractor> ShowReport(int MRCId)
        {
            var q = from m in _ctx.MaterialRequestContractorDetails
                    where m.MaterialRequestContractorId == MRCId
                    join mat in _ctx.MaterialDescriptions on m.MaterialDescriptionId equals mat.Id
                    join l in _ctx.Lines on m.LineId equals l.Id 
                    join joint in _ctx.Joints on m.LineId equals joint.LineId 

                    join sheet in _ctx.Sheets on joint.SheetId equals sheet.Id
                    join testjoint in _ctx.TestPackageJoints on joint.Id equals testjoint.Id
                    join testpack in _ctx.TestPackages on testjoint.TestPackageId equals testpack.Id
                    select new ViewReportMaterialRequestContractor()
                    {
                        Id = m.Id,
                        ItemCode = mat.ItemCode,
                        LineNumber = l.LineNumber,
                        Description = mat.Description,
                        Size1 = mat.Size1.ToString(),
                        Size2 = mat.Size2.ToString(),
                        DocumentNumber = l.DocumentNumber,
                    };
            return q;
        }

我在UI中调用我的函数,正如你所看到的:

    List<ViewReportMaterialRequestContractor> lstMaterialRequestContractorDetails = _reportMaterialRequestContractorRepository.ShowReport(Id).ToList().Distinct().ToList();

我的记录重复4次,我有4条记录重复4次,所以我有16条记录,所以我必须使用distinct来删除重复的记录。

但是结果又显示了16个记录。为什么?

对于我的查询c# linq, Distinct不工作

当你做.ShowReport(Id).ToList().Distinct().ToList()时,Distinct()被称为Enumerable.Distinct<TSource>(this IEnumerable<TSource> source),这将从第一个.ToList()创建一个内存集合,然后使用。net中的相等规则为ViewReportMaterialRequestContractor类(默认情况下是通过对象引用进行比较,而不是通过值进行比较,如果你没有覆盖.Equals(object).GetHashCode())

当您执行.ShowReport(Id).Distinct().ToList()时,调用的Distinct()Queryable.Distinct<TSource>(this IQueryable<TSource> source),这会将不同的in转换为SQL查询调用并在服务器上执行,使用SQL server中的相等规则(将根据每个返回列的值进行比较)