2016-09-22 100 views
1

我試圖讓下面的查詢工作:兒童無法評價

var query = from c in context.ChargeMultipliers where c.Description.Replace(" ", string.Empty).ToUpper() == description.ToUpper().Replace(" ", string.Empty)select c; 

在上面,我試圖將SQL領域的「描述」修剪成不帶空格的字符串,全部大寫和比較描述字符串也被修剪並轉換爲上層。但是,作爲查詢的結果,我收到「兒童無法評估」。

爲什麼會發生這種情況的任何想法?

+0

請發佈異常堆棧跟蹤。 –

+0

很可能Linq to Entities無法翻譯有效SQL中的c.Description.Replace(「」,string.Empty).ToUpper(),只需嘗試使用Linq將Linq上的對象轉換爲實體。 – Vladimir

回答

0

當調試查詢時,會產生以下SQL語句:

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Description] AS [Description], 
    FROM [dbo].[ChargeMultipliers] AS [Extent1] 
    WHERE (UPPER(REPLACE([Extent1].[Description], N' ', @p__linq__0))) = (UPPER(REPLACE(@p__linq__1, N' ', @p__linq__2))) 

正如你所看到的,比較也修剪在SQL語句和的String.Empty woud作爲參數,但這可能不是傳遞理解數據庫中的空白字符。

我寧願構建查詢前要做到這一點:現在

 string descriptionTrim = description.Replace(" ", string.Empty).ToUpper(); 

     var query = from c in context.ChargeMultipliers 
        where c.Description.Replace(" ", "").ToUpper() == descriptionTrim 
        select c; 

生成的SQL查詢看起來很簡單,你可以很容易找到真正會在WHERE子句中進行比較:

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Description] AS [Description], 
    FROM [dbo].[ChargeMultipliers] AS [Extent1] 
    WHERE (UPPER(REPLACE([Extent1].[Description], N' ', N''))) = @p__linq__0 
+0

的確如此。用'「」替換'string.Empty'將消除其中一個參數。但所有這些都不能回答OP的問題。 –

+0

我剛剛改進了我的答案。用「」替換string.Empty可能會有幫助,因爲c#string.Empty不一定與數據庫的'empty'匹配。 – Patrick

+0

問題的關鍵在於是否有所改善,你是在回答一個不同的問題,而不是OP所要求的問題,這是什麼原因造成的*「兒童無法評估」異常*。 –