2011-08-04 5 views
5

私はjoinメソッドを使って2つのLINQクエリを書いています。基本的に、結合するオブジェクトの順序を切り替えると、クエリが機能しなくなり、エラーがスローされます。このLINQ結合クエリは機能しますが、このLINQ結合クエリはなぜ機能しませんか?

"'Domain.Entities.UsersSitesRole'の定数値を作成できません。 Int32、String、およびGuid 'など)がこのコンテキストでサポートされています。

 var foo2 = //works 
      from p in privilegesForUser 
      join c in repository.Child on p.SiteId equals c.Child_SiteID 
      select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel }; 

     var foo3 = //throws exception 
      from c in repository.Child 
      join p in privilegesForUser on c.Child_SiteID equals p.SiteId 
      select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel }; 

オブジェクトprivilegesForUserは、私のEntity Frameworkのコンテキスト(UsersSiteRole)から派生したエンティティのリストである、とrepository.Childは同様に私のEFコンテキストからIQueryable<Child>です。

+1

投げられた例外も表示してください。 – Jethro

+2

@Jethro:もう一度質問を読んでください。 – BoltClock

答えて

4

これは、EFが拡張メソッドで取得する式ツリーを解析する方法によって発生します。

多くの場合、クエリが論理的に正しく、IEnumerable(Linq to Objects)で正常に実行されますが、Linq to Entitiesでは失敗します。基本的には、論理式ツリーだけを適切なSQL文にコンパイルすることはほとんど不可能です(SQLは理想的ではなく、オブジェクト指向の世界から遠くありません)。これはEFが諦める場合です。時間が経つにつれて、あなたは何が効果的で何が効果がないかを理解することに慣れます。

+0

私はこの[リンク](http://msdn.microsoft.com/en-us/library/bb513866.aspx)に出くわしました。これは私がやっていることを試してはいけないということを示しています(データベースからのデータを用いたメモリ収集)。私は、データの両方のセットを.ToList()して、結合順序にまだ影響がある場合はそれらを結合するのだろうか。 – Elbelcho

+0

30個のオブジェクトを別の30個に結合したい場合は、便利です。数千人で同じことをすることは容認できません。それはすべてデータ量に関するものです。 また、** SQLプロファイラ**を使用して、クエリの仕組みを判断してください。あなたの作業バージョンで試して、実際に何が起こっているかを見てください。 –

+0

提案、素晴らしいアイデアをありがとう。また、私がテストしたところ、私の場合は、.ToList()から作成された2つのメモリオブジェクトで操作している場合、結合順序は無関係になります – Elbelcho

関連する問題