2016-09-07 3 views
1

Id、Name、BinaryDataの各プロパティを持つ添付ファイルを持つことができるパンチを含むモデルがあります。EF6に部分的なエンティティのみを含める

私が行う場合は、次の添付ファイルが多く、大規模の両方をすることができるため

var result = context.PunchSet 
    .Where(p => p.PunchType == punchType && p.Project.Id == projectId) 
    .Include(c => c.Contractor) 
    .Include(c => c.ClearedBy) 
    .Include(c => c.CreatedBy) 
    .Include(a => a.Attachments) 

クエリはmolassisとして遅いです。この場合、必要なのは添付ファイルのIDと名前だけです。

var result = context.PunchSet 
    .Where(p => p.PunchType == punchType && p.Project.Id == projectId) 
    .Include(c => c.Contractor) 
    .Include(c => c.ClearedBy) 
    .Include(c => c.CreatedBy) 
    .Include(a => a.Attachments.Select(a2 => new Attachment() { Id=a2.Id, Name=a2.Name}); 

をしかし、それは、このエラーで終わる:だから私は試した

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties. Parameter name: path

は、それは意味、私は時間のために立ち往生していたもののアイデアを持っていません。どのように結果に部分的なentitiyを含めることができますか?私。バイナリデータを読み込まないでください。

+0

を望むように

var result = from p in context.PunchSet where (p.PunchType == punchType && p.Project.Id == projectId) select new { p, Contractor=p.Contractor, ClearedBy =p.ClearedBy, CreatedBy=p.CreatedBy, Attachments= from a in p.Attachments select new { Id= a.Id, Name =a.Name, }, }; var result2 = result.AsEnumerable() .Select(c => c.p); 

その後、あなたは繰り返すことができます。ただし、更新するのではなく読み込むだけの場合は、インクルードファイルに添付ファイルを残して別々に読み込むことができます。 – grek40

+1

同じクエリでこれを行うにはどうすればよいですか?私は500個のパンチをロードしたくないので、ループを張って添付ファイルを取り出す必要があります(もしあれば)。これは、良い古いSQLの5分の仕事です。時にはこのEF6のものが私に届いています。 – Paaland

+1

部分的に関連するエンティティを読み込む必要がある場合は、匿名型またはDTOを使用してクエリを投影する必要があります。例外が説明するように、ナビゲーションプロパティは 'Include'拡張メソッドでのみ参照できます – octavioccl

答えて

1

1つのクエリですべてのプロパティを選択し、それらをメモリにまとめることができます。

db.PunchSet 
    .Include(x => x.Contractor) 
    // ... other includes of complete objects 
    // then select properties for partial include 
    .Select(x => new { obj = x, att = x.Attachments.Select(a => new { a.Id, a.Name }) }) 
    // end of database query context 
    .AsEnumerable() 
    // join the results in memory 
    .Select(x => 
    { 
     x.obj.Attachments = x.att.Select(a => new Attachment() { Id = a.Id, Name = a.Name }).ToList(); 
     return x.obj; 
    }); 
0

次のように試すことができます。あなたはあなたが部分的に含めることはできません:)

foreach(var r in result2) 
{ 
    foreach(var a in r.Attachments) 
    { 
     //your code; 
    } 
} 
関連する問題