2
を書かれていない、実際のSQLコレクションである:Entity Frameworkのグループによってかつ効率的に
var person = await _tmsContext.Person.SingleOrDefaultAsync(p => p.UserID == userId);
person.PersonContactNumbers
.Where(x => clientNumberTypes.Contains(x.ContactNumberTypeId)
&& x.ValidFromDate < DateTime.Now
&& (!x.ValidToDate.HasValue || x.ValidToDate > DateTime.Now))
.GroupBy(x => x.ContactNumberTypeId, (key, group) =>
group.OrderBy(cnt => cnt.DateCreated)
.Select(cnt => new { cnt.ContactNumber, cnt.ContactNumberTypeId })
.FirstOrDefault())
.ToList();
生成されたSQLは次のようになります。
exec sp_executesql N'SELECT
[Extent1].[PersonContactNumberID] AS [PersonContactNumberID],
[Extent1].[ContactNumberTypeID] AS [ContactNumberTypeID],
[Extent1].[ContactNumber] AS [ContactNumber],
[Extent1].[ValidFromDate] AS [ValidFromDate],
[Extent1].[ValidToDate] AS [ValidToDate],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx],
[Extent1].[xxxxxxx] AS [xxxxxxx]
FROM [dbo].[tjPersonContactNumber] AS [Extent1]
WHERE [Extent1].[PersonID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=XXXXXXX
これは、EFが指定された人物のすべての連絡先番号を要求していることを明確に示しています。
少量のデータでは、大量のデータが存在する(人との接触は単なる例です)場合によっては、使用されない(xxxxxx)列が返されるだけでなく、かなりの時間。
EFがこのような単純なクエリを作成していて、残りの部分を実行する理由を知っている人はいますか?誰でもEFにグループを実行させてクエリをフィルタリングする方法を知っていますか?