2016-08-26 3 views
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にグループを実行させてクエリをフィルタリングする方法を知っていますか?

答えて

2

問題はあなたが熱心に読み込まれた子オブジェクトを持っているように見えます。

コンテキストに直接アクセスし、子オブジェクトを呼び出すことはできますか?あなたは熱心なロードが無効になっていることを確認されていない場合これは、より高速なクエリ

を生成する必要があります

dbContext.PersonContactNumbers.Where(x=>x.PersonId == yourId) 

よう

何か。

関連する問題