【问题标题】:Children could not be evaluated无法评估孩子
【发布时间】:2016-09-22 08:51:03
【问题描述】:

我正在尝试使以下查询工作:

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

在上面我试图将 sql 字段“描述”修剪成一个没有空格的字符串,所有大写和比较描述字符串也被修剪并转换为大写。但是,我收到“无法评估儿童”作为查询的结果。

关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 请发布异常堆栈跟踪。
  • 可能 Linq to Entities 无法在有效 SQL 中转换 c.Description.Replace(" ", string.Empty).ToUpper(),您只需尝试使用 Linq to 对象上的 Linq to Entities。

标签: c# sql entity-framework linq


【解决方案1】:

调试查询时,会生成以下 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语句和字符串中也进行了比较。Empty将作为参数传递,这可能不是数据库理解的空字符。

我希望在构建查询之前执行此操作:

        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

【讨论】:

  • 确实如此。同样用"" 替换string.Empty 将消除其中一个参数。但这一切都没有回答 OP 的问题。
  • 我刚刚改进了我的答案。将 string.Empty 替换为 "" 可能会有所帮助,因为 c# string.Empty 不一定与数据库的 'empty' 匹配。
  • 关键是改善与否,您正在回答一个不同的问题,而不是 OP 提出的问题,这是导致 “无法评估儿童”异常的原因.
  • 你是对的。查询比错误信息更吸引我,顺便说一句,我在调试模式之外从未见过。
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 2020-11-10
  • 2010-09-16
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多