2011-05-17 5 views
0

LINQのツーエンティティは、コンパイルされたクエリでの整数のリストでIDと一致して、私は、フォームのLINQのツーエンティティコンパイルされたクエリを実装する方法を見つけようとしている

Func<MyEntities, List<int>, IQueryable<MyClass>> query = System.Data.Objects.CompiledQuery.Compile(
    (MyEntities entities, List<int> IDs) => (
     (from au in entities.Mine where IDs.Any(x => x == au.ID) select au) 
    )); 

のみスカラーので、パラメータをCompiledQueryに渡すことができます。上記のエラーは発生しません。私は、文字列として整数のカンマ区切りのリストを渡すためにいくつかの巧妙な方法を見つけるとの線に沿ってL2Eクエリでそれを使用しようとしている:

Func<MyEntities, string, IQueryable<MyClass>> query = System.Data.Objects.CompiledQuery.Compile(
    (MyEntities entities, string IDs) => (
     (from au in entities.Mine where IDs.Split(',').Any(x => Convert.ToInt32(x) == au.ID) select au) 
    )); 

しかし、それが原因サポートされていないスプリットに動作しません。関数。

これをどのように実装できるかについての賢明なアイデアはありますか?

答えて

0

私はそれをやり遂げる方法を見つけ出しましたが、それは3秒ほどでは遅すぎます。

string ids = "|" + String.Join("|", new List<int> { 4, 5, 6, 7, 8, 9, 10, 20, 23, 34 }) + "|"; 

Func<MyEntities, string, IQueryable<MyClass>> query =  System.Data.Objects.CompiledQuery.Compile(
(MyEntities entities, string IDs) => (
    (from au in entities.Mine where IDs.Contains("|" + SqlFunctions.StringConvert((decimal)au.ID).Trim() + "|")select au) 
)); 

図面ボードに戻る。

0

私は、これはおそらく仕事ができるかどうかわからないんだけど、多分List<int> IDsMyEntities entitiesを結合を使用してみては?

0

できません。

CompiledQueryは何をしますか?これは、プロバイダがSQLを生成するために使用する中間表現である正規のコマンドツリーにクエリを事前変換します。

スカラーパラメータを持つコマンドのSQLは、param値にかかわらず同じ構造です。しかし、2つの項目のリストに対して生成されるSQLは、構造的に異なるとなります。WHERE節で述語がORより少なくて済むので、SQLからの3つの項目のリストからはとなります。結局のところ、DBサーバーはparam値としてリストを取得することはありません。

あなたの文字列/ | kludgeは、リストではなく1つのパラメータをDBサーバーに渡すようになっているので機能します。しかし、あなたが見たように、サーバはそのようなクエリのインデックスを作成することができないので、遅くなります。

関連する問題