我知道在Linq中,我必须在执行OrderBy
之后执行Select - Distinct
,但是我试图按Select
之后丢失的Included实体属性进行排序。
例如:
var accounts = _context.AccountUser
.Include(o => o.Account)
.Where(o => o.UserId == userId || o.Account.OwnerId == userId)
.OrderByDescending(o => o.LastAccessed)
.Select(o => o.Account)
.Distinct();
当我通过两个不同参数的Where
来or
时,很可能获得重复的结果。这就是为什么我使用Distinct
。
这里的问题是,在执行Select
之后,我不再具有LastAccessed
属性,因为它不属于所选实体。
我想可以从查询本身推断AccountUser
和Account
的结构。
答案 0 :(得分:0)
如果您设置了双向导航属性:
var accountsQuery = _context.AccountUser
.Where(o => o.UserId == userId || o.Account.OwnerId == userId)
.Select(o => o.Account)
.Distinct()
.OrderByDescending(a => a.AccountUser.LastAccessed);
选择帐户时,您不需要.Include()
。请记住,您从该帐户访问的所有相关实体都将被延迟加载。我建议使用.Select()
来提取展平的视图模型或视图模型层次结构,以便SQL加载所有需要的字段,而不是急于加载所有内容或触发延迟加载。
答案 1 :(得分:0)
由于LINQ没有实现DistinctBy
并且LINQ to SQL没有实现占用Distinct
的{{1}},因此必须替换为IEqualityComparer
+ GroupBy
代替:
Select