Where句でインターフェイスを使用しようとするのに、なぜL2Eはチョークするのですか?
-
29-09-2019 - |
質問
私は、かなり複雑なセットベースのフィルタリングが進行しているいくつかのエンティティクエリ(EF 4を使用)を(EF 4を使用して)持っています。コードは正常にコンパイルされますが、実行しようとすると、次のエラーが表示されます。
タイプ「itextentity」の一定の値を作成できません。このコンテキストでは、プリミティブタイプ( 'int32、string、guidなどの')のみがサポートされています。
今コードのために。私は次のように見えるインターフェイスを持っています:
public interface ITextEntity
{
int ID { get; set; }
string TextValue { get; set; }
EntityCollection<Product> Products { get; set; }
}
アイデアは、これらの「テキストエンティティ」がプロパティを保存するルックアップテーブルを表しているということです。 Product
. 。製品に色がある場合、すべての赤製品にはTextValue = "Red"の色エンティティが含まれ、このインターフェイスで装飾された色のエンティティがあります。
public partial class Color : ITextEntity
{
//ID, TextValue, and Products implemented in EF-generated code
}
itextentitiesには1:nまたはn:nの関係がある場合があります Product
.
ネストされたコレクションがあります(実際にはa List<IEnumerable<ITextEntity>>
)実装するさまざまなエンティティのセットが含まれています ITextEntity
インターフェース。これらのセットを使用してシーケンスをフィルタリングしたい Product
s半包括的な方法。これがコードです:
List<IEnumerable<ITextEntity>> InclusiveFilters;
IQueryable<Product> Products;
//...snip...
Products = Products.Where(prod =>
InclusiveFilters.All(filter =>
filter.Any(iTextEnt =>
iTextEnt.Product.Contains(prod)
)
)
);
だから私がやろうとしているのはこれです:
- 私はフィルタリングしたいセット、製品を持っています。
- 実装するいくつかのタイプのそれぞれについて
ITextEntity
, 、そのタイプのエンティティのセットがあります。- 各オブジェクトoには、製品の設定opがあります。
- 製品の製品製品ごとに、
セットごとに、
少なくとも1つのoの場合、
OPには製品が含まれている必要があります。そうでない場合は、製品から製品を取り外します。
ご覧のとおり、これはかなり複雑です。
私はこれがlinqが一緒に働くことができないことによって引き起こされると感じています ITextEntity
私のセット操作の問題ではなく、入力します。ただし、上記の複雑さにより、これを操作するのが難しく、非LINQの代替品を見つけることは困難です。 Linqを使用できない場合、かなり醜くなります。
私は見つけました MSDNページ そしてa スタックオーバーフロースレッド 同様の例外について議論しますが、どちらもそれほど助けはありませんでした。 別のSOスレッド 私の使用を目指しています Contains
方法ですが、ここでの複雑さのために、私はそれを置き換えようとすることをあまり運んでいませんでした Buildorexpression 方法。これはEF 4であり、 Contains
サポートされるはずです。
だから私はかなりここで立ち往生しています。誰かがアドバイスできますか?
編集: :この質問は2010年8月に回答されましたが、タイトルと説明をクリーンアップするために戻ってきました。
解決
あなたは暗黙的にキャストしています ITextEntity
. 。だが ITextEntity
エンティティデータモデルの一部ではないため、EFはメンバーをSQLに翻訳する方法を知りません。 Contains
サポートされていますが、プリミティブまたはエンティティの種類のみがあります。また、使用します IEnumerable
, 、SQLへの翻訳も防止します。あなたが必要です IQueryable
SQLに変換できるようにします。
したがって、インターフェイスリファレンスを削除する場合 IEnumerable
, 、DBサーバーでクエリを実行できるはずです。それ以外の場合は、L2Oに移動する必要があります(例えば、 AsEnumerable()
).