1

私はこれにほぼ 9 時間取り組んできましたが、何が起こっているのか理解できません。ユーザーが where 句にパーツを追加できる Advanced Query Builder を作成しました。私の計画は、遅延実行を利用することでした。問題は、レコードがあることを知っていたもののカウントが 0 になり続けたことです。これをさらに不可解にしたのは、複数のクエリがある場合にのみ発生したことです。私のデータ モデルとすべてのコードを紹介することはできないため、これを要約して、基本的なコード サンプルを次に示します。

        string foo = "smith";
        var result = context.claims.AsQueryable();
        var temp = from p in result
                   where p.Prescription.Patient.last_name.Contains(foo)
                   select p;
        foo = "jo";
        temp = from p in temp
               where p.Prescription.Patient.first_name.Contains(foo)
               select p;
        int count = temp.Count();

これで、患者の姓が「%smith%」、名が「%jo%」のような結果を返すクエリが得られると期待しています。ただし、実行されるクエリは次のとおりです。

    exec sp_executesql N'SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM     [dbo].[claim] AS [Extent1]
    INNER JOIN [dbo].[Prescription] AS [Extent2] ON [Extent1].[prescriptionId] = [Extent2].[id]
    LEFT OUTER JOIN [dbo].[Patient] AS [Extent3] ON [Extent2].[patient_id] = [Extent3].[id]
    LEFT OUTER JOIN [dbo].[Prescription] AS [Extent4] ON [Extent1].[prescriptionId] = [Extent4].[id]
    LEFT OUTER JOIN [dbo].[Patient] AS [Extent5] ON [Extent4].[patient_id] = [Extent5].[id]
    WHERE ([Extent3].[last_name] LIKE @p__linq__0 ESCAPE N''~'') AND ([Extent5].[first_name] LIKE @p__linq__1 ESCAPE N''~'')
)  AS [GroupBy1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',**@p__linq__0=N'%jo%',@p__linq__1=N'%jo%**'

実行されたクエリからわかるように、意図した結果が得られませんでした。代わりに、linq クエリの両方のパラメーターを、変数の最後の値が設定されたものに設定します。

誰かがなぜこれが起こっているのか説明できますか? 回避策を見つけましたが、きれいではありません。可能な列ごとに変数を宣言し、その変数 = を値に設定してから、linq ステートメントでその変数を使用する必要があります。

        string foo = "smith", foo2 = "jo";
        var result = context.claims.AsQueryable();
        var temp = from p in result
                   where p.Prescription.Patient.last_name.Contains(foo)
                   select p;
        temp = from p in temp
               where p.Prescription.Patient.first_name.Contains(foo2)
               select p;
        int count = temp.Count();
4

1 に答える 1

0
int count = result.Count(x=> x.Prescription.Patient.last_name.Contains(foo) && 
                             x.Prescription.Patient.first_name.Contains(foo2));

また

var result = (from p in result
              where (p.Prescription.Patient.last_name.Contains(foo) && 
                     p.Prescription.Patient.first_name.Contains(foo2))
              select p).Count();

PredicateBuidlerを使用して式の述語を動的に構成することも検討してください。&& と || を組み合わせた複雑なクエリを動的に作成する必要がある場合に便利です。

于 2012-08-31T19:51:03.560 に答える