是否可以使用实体框架核心将DISTINCT
关键字发送到生成的SQL命令中?在获取不同的值时,我看到的所有示例都是在值被重新整理之后调用.Distinct()
,因此数据库正在发送大量数据,而数据库可以自己完成不同的操作。
这将适用于一个匿名对象,其中包含许多值,从ints到字符串和字节数组。
我知道我可以做.GroupBy().Select()
,但这还是在数据到达之后,而不是以前。
示例不适用于匿名类型:
(From a In DatabaseContext.Associate
Join ac In DatabaseContext.AssociateClassification On ac.AssociateId Equals a.AssociateId
Join ad In DatabaseContext.AssociateDepartment On ad.AssociateId Equals a.AssociateId
Join ass In DatabaseContext.AssociateScheduleStaffing On ass.AssociateId Equals a.AssociateId
Group Join ap In DatabaseContext.AssociatePhoto On ap.AssociateId Equals a.AssociateId Into apg = Group
From ap In apg.DefaultIfEmpty()
Where ac.ClassificationId.Value = ClassificationId AndAlso
a.Inactive.Value = Convert.ToByte(0) AndAlso
departments.Contains(ad.Department) AndAlso
ass.UseJbDev.Value = Convert.ToByte(1) AndAlso
Not DatabaseContext.Schedule.Any(Function(s) s.AssociateId = a.AssociateId AndAlso s.StartTime.Value >= Day AndAlso s.StartTime.Value < Day.AddDays(1))
Select a.AssociateId, a.AssociateNumber, a.FullName, a.Inactive, ap.Photo, ass.DateSeniority).Distinct().ToList()
FYI:如果我删除了和ass.DateSeniority,那么所有对象都是“关联”类型,并且不同的工作方式,那么它就可以执行了。
但是,这是在事实之后,因为当查看创建的SQL时,它不是一个选择不同的,也不是在SQL中出现的不同。
发布于 2020-04-24 11:53:25
在我看来,答案似乎是“不同”的扩展方法不能比较复杂类型对象的值。为了比较复杂类型的值,我需要实现IEqualityComparer<T>
接口。
这就是为什么如果对象的所有属性都来自同一类型,那么当您混合属性并创建匿名类型时,内置的比较器无法工作,需要实现您自己的比较器。
https://stackoverflow.com/questions/61264287
复制