2011-07-05 3 views
4

私はasp.net MVCでウェブサイトを作っていますが、私はリポジトリインタフェースを使ってメモリ内のリポジトリとデータベースを使用しています。エンティティフレームワークにインクルードメソッドに関する質問

私はすべての私の関係を修正しました。例えば、私は彼がアドレスを持っているよりも1つの連絡先を持っているとします。この連絡先に1つのアドレスを追加すると、address.contactのrelashionshipが自動的にフィックスアップされます。私はエンティティフレームワークのプロパティ仮想を残して、データベースリポジトリを使用してプロキシを作成します。

私の質問はここから:

私はこのようなもののクエリがあります。

return query.Where(c => c.UserID == clientId) 
         .Include(c => c.AssignedProjects) 
         .Select(c => new UserDetailsData<Client> 
         { 
          User = c, 
          IssuesCount = c.IssuesReported.Count() 
         }).Single(); 

などが使用しています。 Selectを削除した場合、assignedProjectsにはこのクライアントのプロジェクトが含まれますが、Select AssignedProjectsをインクルードするとnullです。匿名オブジェクトは正常ですが、ユーザーにはAssignedProjectsが含まれていません。

私はそれを行うことができますが、EFを使用することはできません。

最終的なグラフは..クライアントIDを持つユーザーが自分のプロジェクトでAssignedProjectsを収集し、User(コレクションを持つ)とIssuesCountを使用してAssignedProjects、User情報、およびクライアントから報告された問題の数..

どのように私はこれを解決することができますか?

+0

正直、これは完全に間違っている可能性がありますが、私は通過していたと私はそれをショットを与えるだろうと思った。おそらくincludeとselectの間でAsQueryable()で作業してみてください。それがあなたにとって何かをするかどうか私に教えてください:P。 – OpticalDelusion

答えて

0

:あなたは、最終的なグラフは、あなたが実際のカウントを実行することに加えて欲しいものであると述べているので

、なぜにこれをオンにしないで、あなたが、

return query.Where(c => c.UserID == clientId) 
      .Select(c => new UserDetailsData<Client> 
      { 
       User = c, 
       AssignedProjects = c.AssignedProjects, 
       IssuesCount = c.IssuesReported.Count() 
      }).Single(); 

あなたがそれに投影するタイプのAssignedProjectsプロパティに本当に関心がなければ、User.AssignedProjectsプロパティも設定されます。これは、コンテキストにロードされたオブジェクトのナビゲーションプロパティを自動的に構築するEFの機能である「リレーションシップスパン」を活用します。

これは実際には、オブジェクトをコンテキストにロードするという事実に依存していることに注意してください。クエリでAsNoTracking()などを使用してトラッキングを無効にすると、それ以上は機能しません。

+0

このコードはうまく動作しますが、 (インクルードで投影する)と私の見解では、私は別のエンティティを通過するコレクションポインタを使用することはできませんので、この問題.. ..しかし、今まではより良い解決策です。 – anotherNeo

0

エンティティフレームワークを使用してストア式を生成する限り、Include(eager loading)はSelect(射影)では機能しません。

さらに詳しい情報はIf I select from an IQueryable then the Include is lostをご覧ください。また、その周辺での作業も表示されます。あなたの投影は(むしろ期待オブジェクトより)、複数のリターンを持っているよう

その周りの作業が記載されていた場合、私はわからないが、あなたのケースでいえ動作します。あなたはこれを試すことができ

var user = query.Where(c => c.UserID == clientId) 
    .Include(c => c.AssignedProjects) 
    .Include(c => c.IssuesReported) 
    .Single(); 

var userDetailsData = new UserDetailsData<Client>() 
{ 
    User = user, 
    IssuesCount = user.IssuesReported.Count(), 
}; 
+0

返事をありがとう。はい、最初に私はその解決策について考えましたが、私は本当に問題の数がほしいと思っています。私はちょうどそれらを数えるためにメモリにロードされた問題はありません;) – anotherNeo