0

かなり複雑なセットベースのフィルタリングが行われている LINQ to Entities クエリ (EF 4 を使用) があります。コードは正常にコンパイルされますが、実行しようとすると次のエラーが発生します。

タイプ 'ITextEntity' の定数値を作成できません。このコンテキストでは、プリミティブ型 (Int32、String、および Guid など) のみがサポートされます。

今コードのために。次のようなインターフェイスがあります。

public interface ITextEntity
{
    int ID { get; set; }
    string TextValue { get; set; }
    EntityCollection<Product> Products { get; set; }
}

これらの「テキスト エンティティ」は、 のプロパティを格納するルックアップ テーブルを表すという考え方ですProduct。Products に色がある場合、すべての赤い Products には TextValue = "Red" の Color エンティティが含まれ、このインターフェイスで装飾された Color エンティティが存在します。

public partial class Color : ITextEntity 
{ 
    //ID, TextValue, and Products implemented in EF-generated code
}

ITextEntities は、 に戻る 1:N または N:N の関係を持つ場合がありますProduct

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

だから私がやろうとしていることはこれです:

  1. フィルタリングしたい製品セットがあります。
  2. を実装するいくつかのタイプのそれぞれについてITextEntity、そのタイプのエンティティのセット S があります。
  3. 各オブジェクト O には積の集合 OP があります。
  4. Products 内の各 Product prod、
    各セット S、S
    内の少なくとも 1 つの O について、
    OP には prod が含まれている必要があります。そうでない場合は、Products から prod を削除します。

ご覧のとおり、これはかなり複雑です。

ITextEntityこれは、セット操作の問題ではなく、LINQ が型を操作できないことが原因であると感じています。ただし、上記の複雑さにより、これを使用することが難しくなり、LINQ 以外の代替手段を見つけるのが難しくなります。LINQ を使用できないと、かなり見苦しくなります。

同様の例外について議論している MSDN ページスタック オーバーフロー スレッドを見つけましたが、どちらもあまり役に立ちませんでした。別の SO スレッドは、私のメソッドの使用法を指し示していますが、ここでは複雑であるため、 BuildOrExpressionContainsメソッドに置き換えようとしてもうまくいきませんでした。これは EF 4 であり、サポートされるはずなので、とにかく BuildOrExpression が機能するとは思えません。Contains

だから私はむしろここで立ち往生しています。誰でもアドバイスできますか?

編集: この質問は 2010 年 8 月に回答されましたが、タイトルと説明を整理するために戻ってきました。

4

1 に答える 1

1

暗黙的ににキャストしていITextEntityます。ただしITextEntity、これはエンティティデータモデルの一部ではないため、EFはそのメンバーをSQLに変換する方法を知りません。Containsサポートされていますが、プリミティブタイプまたはエンティティタイプでのみサポートされます。また、を使用IEnumerableします。これにより、SQLへの変換も防止されます。IQueryableSQLに変換可能である必要があります。

したがって、インターフェイス参照とを削除するとIEnumerable、DBサーバーでクエリを実行できるようになります。それ以外の場合は、L2Oに入る必要があります(たとえば、AsEnumerable())。

于 2010-08-19T19:29:46.460 に答える