2013-07-18 5 views
10

[OK]を、私は何かダムを行う必要がありますが、この作品ではないはずですか?私は次の3つのリストを持っています:LINQで3つのリストを1つに連結すると、例外がスローされます

var commonViews = (from v in context.TPM_VIEWS where v.VIEWID < 0 select v); // IQueryable<TPM_VIEWS> 
var ownedViews = (from v in context.TPM_VIEWS where v.OWNERID == userId && v.VIEWID > 0 select v); // IQueryable<TPM_VIEWS> 
var sharedViews = (from v in context.TPM_USER.Include("TPM_VIEWS2") where v.USERID == userId select v).First().TPM_VIEWS2; // EntityCollection<TPM_VIEWS> 

各リストには適切な値とカウントがあります。

return commonViews.ToList(); 

そして私は、これらのリストのいずれかを返すことができます:私はこれらのリストのいずれかを返すことができ

return commonViews.Concat(ownedViews).ToList(); 

しかし、私は3つすべてを返却しようとすると:

return commonViews.Concat(ownedViews).Concat(sharedViews).ToList(); 

例外が発生します。

'Entity.TPM_VIEWS'タイプの定数値を作成できません。このコンテキストでは、 プリミティブ型または列挙型のみがサポートされています。

私は間違っていますか? 3つの値はすべて実際に列挙可能です。ほとんどの場合、私はこの問題を尋ねています。なぜなら、投稿してから30秒後に問題に気付くことを保証するための最良の方法だからです。

UPDATE:

私は問題がここにある93%確信している:このTPM_VIEWSオブジェクトの列挙リストのように見える

var sharedViews = (from v in context.TPM_USER.Include("TPM_VIEWS2") where v.USERID == userId select v).First().TPM_VIEWS2; 

、と私はそれにToList()を呼び出すことができますし、正しいデータを取得しますが、他のリストとはうまく動作しません。

UPDATE 2:

これは実際に動作します。なぜ私に教えることができる人へのポイント!

commonViews.ToList().Concat(ownedViews.ToList()).Concat(sharedViews.ToList()).ToList(); 
+0

「sharedViews」を先に入れてみてください。はい;私は真剣にそれを修正するだろうと思う。 – SLaks

+0

EFの私の非常に基本的な歴史に基づいて、私は賞を賭けることを喜んでいるでしょう@SLaksは正しいです。 – JerKimball

+0

これは奇妙です。 'sharedViews.Concat(commonViews).Concat(ownedViews).Count()'は6(正しい)を返しますが、 'sharedViews.Concat(commonViews).Concat(ownedViews).ToList();'は同じ例外をスローします。 'sharedViews'を使っているのは確かなことです。基本的には、与えられた 'userId'から' IEnumerable 'を取得する必要があります。 –

答えて

5

問題はEF IQueryable<T>Concat()は、単一のクエリに全体の連結をオンにすることです。

.Concat(sharedViews)を呼び出すと、ネストされたエンティティクラスのスカラー(プリロード済み)コレクションが渡されます。
EFはそれをクエリに変換する方法を知らないので、それは文句です。

ToList()の代わりにAsEnumerable()を呼び出すと、高速化できます。

+0

優秀、私はこれがうまくすべてを集計したと思います! –

+0

@MikeChristensenは$ 5を得るかどうか? – Kevin

+0

私はPayPalを受け入れます。 –

1

これは実際に動作します。なぜ私に教えることができる人へのポイント!元のクエリの各々を別々に実行されるためだ

commonViews.ToList().Concat(ownedViews.ToList()).Concat(sharedViews.ToList()).ToList(); 

。結果をメモリ内で連結するだけです。3つのクエリを組み合わせるとEntity Frameworkクエリトランスレータにバグがあるようですが、それぞれにToListを呼び出すと、EFクエリはなくなり、リストにすぎないので、Linqを使用して連結しますオブジェクトへ。

関連する問題