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();
因爲執行是延遲的,查詢表達式只有在實際枚舉結果('Count()')之後纔會被翻譯。那一刻,'foo'的值是「jo」。 – 2012-08-16 19:21:05
感謝您的快速反應Wiktor!那是有道理的,但它肯定會導致我的邏輯問題!我不相信我找不到其他人看到這個。 – lkeel75 2012-08-16 19:25:37
十分鐘後,您發現了@WiktorZychla,他曾見過它。有兩個不同的字符串作爲兩個不同的字符串有什麼「不美麗」? – 2012-08-16 19:29:22