0

次の形式の Linq-to-Entities コンパイル済みクエリを実装する方法を見つけようとしています。

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.Compile に渡すことができるのはスカラー パラメーターのみであるため、上記は失敗します。コンマで区切られた整数のリストを文字列として渡し、それを次の行に沿って 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)
    ));

ただし、サポートされていない Split 関数のため、これは機能しません。

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

4

3 に答える 3

0

これが機能するかどうかはわかりませんが、join と?を使用してみてください。List<int> IDsMyEntities entities

于 2011-05-17T04:46:32.187 に答える
0

できません。

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

スカラ param を持つコマンドの SQL は、param 値に関係なく同じ構造です。ただし、たとえば、2 つの項目のリストに対して生成される SQL は、3 つの項目のリストの SQLとは構造的に異なります。これは、句ORの述語が 1 つ少ないためです。WHERE結局のところ、ほとんどの DB サーバーはリストをパラメーター値として取りません。

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

于 2011-05-18T18:58:48.050 に答える
0

I ended up finding a way to do it but it's way too slow at around 3s.

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

Back to the drawing board.

于 2011-05-17T05:18:37.163 に答える