对于我的查询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个记录。为什么?
当你做.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中的相等规则(将根据每个返回列的值进行比较)