LinqToSQL を使用してデータベースに対して実行される次の単純化された Linq クエリがあるとします。
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()
型のコレクションが生成されます。これは、クエリが SQL で完全に実行される可能性があることを示しています。IOrderedQueryable
IOrderedEnumerable
私の仮定は正しいですか、それともクエリ全体が SQL に変換されますか?もしそうなら、なぜそうなるのでしょうか?