2012-08-16 38 views
1

我一直在這個工作了近9個小時,只是不明白是怎麼回事。我創建了一個高級查詢生成器,允許用戶將部分添加到他們的where子句中。我的計劃是利用延期執行。問題是,我一直計數0作爲我知道記錄的事情的計數。讓這個更令人費解的是,只有當我有超過1個查詢時纔會發生。因爲我不能給你我的數據模型和我所有的代碼,我總結這件事,這裏是一個基本的代碼示例:Linq實體使用不正確的參數

 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(); 
+2

因爲執行是延遲的,查詢表達式只有在實際枚舉結果('Count()')之後纔會被翻譯。那一刻,'foo'的值是「jo」。 – 2012-08-16 19:21:05

+0

感謝您的快速反應Wiktor!那是有道理的,但它肯定會導致我的邏輯問題!我不相信我找不到其他人看到這個。 – lkeel75 2012-08-16 19:25:37

+0

十分鐘後,您發現了@WiktorZychla,他曾見過它。有兩個不同的字符串作爲兩個不同的字符串有什麼「不美麗」? – 2012-08-16 19:29:22

回答

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來動態組合表達式謂詞。如果您需要動態構建一個複雜的查詢,並將其與& &和||混合起來,那麼這會非常有用。