2012-01-09 16 views
6

私はlinqとジェネリックで実験しています。今のところ、私はちょうど与えられた型のすべてのレコードを返すGetAllメソッドを実装しました。Linqからエンティティ、ジェネリックとプリコンパイルされたクエリ

class BaseBL<T> where T : class 
{ 
    public IList<T> GetAll() 
    { 
     using (TestObjectContext entities = new TestObjectContext(...)) 
     { 
      var result = from obj in entities.CreateObjectSet<T>() select obj; 
      return result.ToList(); 
     } 
    } 
} 

これは問題なく動作します。次に、私は、クエリをプリコンパイルしたいと思います:

ここ
class BaseBL<T> where T : class 
{ 
    private readonly Func<ObjectContext, IQueryable<T>> cqGetAll = 
    CompiledQuery.Compile<ObjectContext, IQueryable<T>>(
     (ctx) => from obj in ctx.CreateObjectSet<T>() select obj); 

    public IList<T> GetAll() 
    { 
     using (TestObjectContext entities = new TestObjectContext(...)) 
     { 
      var result = cqGetAll.Invoke(entities); 
      return result.ToList(); 
     } 
    } 
} 

、私は以下の取得:

base {System.Exception} = {"LINQ to Entities does not recognize the method 
'System.Data.Objects.ObjectSet`1[admin_model.TestEntity] CreateObjectSet[TestEntity]()' 
method, and this method cannot be translated into a store expression."} 

これに伴う問題は何ですか?私は問題がプリコンパイルされたクエリの実行の結果であると思うが、私はなぜfanthomすることができない。

+0

なぜコンパイルされたクエリが必要だと思いますか?あなたはそれを必要としません。 –

+0

エラーには関係ありません。しかし、もしうまくいけば、 'cqGetAll'を' static'フィールドにしたくなります。 –

+0

@Jeff Mercado - この場合は必要ありませんが、もっと複雑なクエリでこれを展開する予定です。 – loodakrawa

答えて

4

エンティティモデルの一部ではないLINQクエリ内のメソッドを使用した場合、この例外が発生しました。プリコンパイルされたクエリは、呼び出すために使用されたコンテキストの一部ではないため、プリコンパイルされたクエリはのCreateObjectSetを呼び出すことができません。

+0

そうですね。 CreateObjectSetと組み合わせてプリコンパイルされたクエリを使用する場合、同じ例外が発生します。つまり、これはジェネリックスとは関係がありません。 – loodakrawa

関連する問題