假设我有以下简化的 Linq 查询,它将使用 LinqToSQL 对数据库运行:
public IEnumerable<MembershipDto> GetAllUserMemberships()
{
return (from m in _workspace.GetDataSource<UserMembership>()
join g in _workspace.GetDataSource<Group>()
on m.GroupID equals g.GroupID
join u in _workspace.GetDataSource<User>()
on m.UserID equals u.UserID
select
new MembershipDto
{
GroupID = g.GroupID,
GroupName = g.Name,
UserID = u.UserID,
UserName = u.Name
}
).Distinct()
.OrderBy(x => x.GroupName)
.ThenBy(x => x.UserName);
}
出于性能考虑,我希望尽可能多地在生成的 SQL 查询中运行此查询;但是我希望在 Linq 中维护业务逻辑,以便轻松进行单元测试。
我遇到的问题是我不确定上述查询在 SQL 中停止执行并开始在内存中进行操作的位置。
我的假设是,一旦数据被选入,new MembershipDto
它就不再在 SQL 中执行;因此后续的OrderBy()
ThenBy()
和Distinct()
操作发生在内存中。
然而,OrderBy()
产生一个类型的集合IOrderedQueryable
而不是一个IOrderedEnumerable
; 这向我表明该查询仍然可以在 SQL 中完整执行。
我的假设是否正确,或者整个查询是否已转换为 SQL,如果是,为什么会这样?