2016-09-22 168 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所要求的问题,这是什么原因造成的*“儿童无法评估”异常*。 –