[英]How can I select from an included entity in LINQ and get a flat list similar to a SQL Join would give?
[英]How can I order in Linq Select Distinct if ordered by an Included entity?
我知道在Linq中,我必须在执行Select - Distinct
之后必须执行OrderBy
,但是我正在尝试通过在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();
当我通过两个不同参数中的一个or
两个来执行Where
,很有可能获得重复的结果。 这就是为什么我使用Distinct
的原因。
这里的问题是在执行Select
,我不再拥有LastAccessed
属性,因为它不属于所选实体。
我认为AccountUser
和Account
的结构可以从查询本身推断出来。
如果您设置了双向导航属性:
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加载所有需要的字段,而不是急于加载所有内容或触发延迟加载。
由于LINQ并未实现DistinctBy
而LINQ to SQL并未实现采用IEqualityComparer
Distinct
,因此您必须使用GroupBy
+ Select
代替:
var accounts = _context.AccountUser
.Include(o => o.Account)
.Where(o => o.UserId == userId || o.Account.OwnerId == userId)
.GroupBy(o => o.Account).Select(og => og.First())
.OrderByDescending(o => o.LastAccessed)
.Select(o => o.Account);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.