10

わかりました、私はばかげたことをしているに違いありませんが、これでうまくいくのではないでしょうか? 次の 3 つのリストがあります。

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();

そして、これらのリストのいずれか2 つを返すことができます。

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

ただし、3つすべてを返そうとすると:

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

私は例外を受け取ります:

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

私は何を間違っていますか?3 つの値はすべて実際に列挙可能です。ほとんどの場合、私がこの質問をするのは、投稿後 30 秒以内に問題に気付くことを保証する最善の方法だからです。

アップデート:

問題がここにあると 93% 確信しています。

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

これはオブジェクトの列挙可能なリストのように見えますTPM_VIEWS。これを呼び出しToList()て正しいデータを取得することはできますが、他のリストではうまく機能しません。

更新 2:

これは実際に機能します。理由を教えてくれる人を指さして!

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

2 に答える 2

5

問題はConcat()、EFIQueryable<T>では連結全体が 1 つのクエリになることです。

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

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

于 2013-07-18T22:12:30.273 に答える
1

これは実際に機能します。理由を教えてくれる人を指さして!

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

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

于 2013-07-18T22:12:56.677 に答える