2012-03-16 14 views
2

と私はマッピング機能を以下ました:マッピングLINQのツーSQLクラスのドメインクラスにネストされたコレクション

private static Expression<Func<ActionComment, Domain.ActionComment>> MapActionComment = 
     actionComment => new Domain.ActionComment 
     { 
     Id = actionComment.Id, 
     Comment = actionComment.Comment, 
     }; 

    private static Expression<Func<Action, Domain.Action>> MapAction = 
     action => new Domain.Domain 
     { 
     Id = action.Id, 
     Comments = action.ActionComments 
         .Select(ac => MapActionComment.Invoke(ac)) 
     }; 

    private static Expression<Func<Nc, Domain.Nc>> MapNc = 
     nc => new Domain.Nc 
       { 
       Id = nc.Id, 
       Actions = nc.Actions 
          .Select(a => MapAction.Invoke(a)), 
       }; 

そして、次のLINQのツーSQLクエリ:

_ctx.NCs 
    .Where(n => n.Id == id) 
    .Select(MapNc) 
    .SingleOrDefault(); 

たSQLステートメントは次のとおりです:

SELECT [t0].[Id], -- columns 
    (SELECT COUNT(*) 
    FROM [dbo].[Actions] AS [t2] 
    WHERE [t2].[NCId] = [t0].[Id] 
    ) AS [value] 
FROM [dbo].[NCs] AS [t0] 
LEFT OUTER JOIN [dbo].[Actions] AS [t1] ON [t1].[NCId] = [t0].[Id] 
WHERE [t0].[Id] = @p0 
ORDER BY [t0].[Id], [t1].[Id] 

アクションオブジェクトのコメントコレクションは内容をロードしませんコレクションの実際の使用量)。

Linq-to-SQLに強制的に生成させる方法はありますかONE Ncs、アクション、ActionCommentsをフェッチする単一の文ですか?

答えて

-1

あなたはLinq2Sql経由で熱心なロードを見てください。たとえば、このブログを参照してください: http://www.lowendahl.net/showShout.aspx?id=190

それはいくつかの問題があるようですが、それはgerenalで動作するはずです。

実際、可能であれば、EntityFrameworkに移行することをお勧めします。現在、LINQ2SQLは従来の技術です。のみ - あなたはL2Sで熱心ロードはそれほど熱心ではありませんので、あなたが「積極的なロードを使用し、」言わないだろうリンク先の記事を読んでいる場合

_ctx.NCs 
    .Where(n => n.Id == id) 
    .Select(MapNc) 
    .Include(nc => nc.Comments) //EF to eager load relation 
    .Include(nc => nc.Actions) //EF to eager load relation 
    .SingleOrDefault(); 
+0

:特に、EFは次のように簡単なInclude()メソッドを使用して、積極的なロードのために良いサポートを持っています1レベル低下。 2つ以上のレベルを下げる必要があるということです。 EFはオプションではありません。それは私が維持している何らかのレガシーシステムです。 – rafek

+0

私はこの記事を読んでいますが、私は今、限界があることを知りました。私は少なくともあなたが見たいところを教えてくれました。 –

関連する問題