如果被包括实体订购,如何在Linq Select Distinct中订购?

时间:2018-11-12 20:51:18

标签: c# asp.net entity-framework linq

我知道在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();

当我通过两个不同参数的Whereor时,很可能获得重复的结果。这就是为什么我使用Distinct

这里的问题是,在执行Select之后,我不再具有LastAccessed属性,因为它不属于所选实体。

我想可以从查询本身推断AccountUserAccount的结构。

2 个答案:

答案 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