【问题标题】:Linq to Entities - "Unable to create a constant value of type 'System.Object'..."Linq to Entities - “无法创建'System.Object'类型的常量值......”
【发布时间】:2013-09-09 20:50:11
【问题描述】:

谁能告诉我为什么这在 LinqPad 中有效,但在我的应用程序中不能作为 C# 表达式?

我正在使用实体框架...

from p in Productions
join t in MaterialTransactions
    on p.Prodn_ID equals t.Prodn_ID
where p.WO_ID == 2345
orderby p.Date descending
select new 
{
    Id = p.Prodn_ID,
    Date = p.Date,
    Line = (p.ProdLine.Factory.Factory_No + '/' + p.ProdLine.ProdLine_No.ToString()),
    Qty = p.Qty,
    Wgt = (double)p.ActWgt,
    Speed = (double)p.ActSpeed,
    MaterialUsed = t.Material.Name}

我收到System.Exception“无法创建类型为'System.Object'的常量值。在此上下文中仅支持原始类型或枚举类型。”

【问题讨论】:

  • 在 LINQ Pad 中很可能使用 LINQ-to-Objects,而 LINQ-to-Entities 有不同的规则。语法相同,但它们的功能/实现不同。
  • ProdLine 和Material 列的SQL 类型是什么?
  • 没有表格和数据我猜 Line=... 是问题所在,尝试将其注释掉,看看你会得到什么。
  • @Belogix LinqPad 使用 Linq-to-Sql,请参阅 linqpad.net/FAQ.aspx。
  • 是的,这很奇怪——它只会在我尝试使用查询结果时抱怨。

标签: c# linq entity-framework


【解决方案1】:

我几天前遇到的重复问题: Best way to concat strings and numbers in SQL server using Entity Framework 5?

我创建了一个 ExpressionVisitor 来解决这个问题,这样我就可以编写干净的代码并在单个查询中尽可能多地运行。 (包含在答案中)

【讨论】:

    【解决方案2】:

    我认为是以下行导致问题:

    Line = (p.ProdLine.Factory.Factory_No + '/' + p.ProdLine.ProdLine_No.ToString())
    

    这是因为它结合了查询结果和 .NET 方法结果。

    也许这会奏效。它将 Line-variable-contents 的创建延迟到查询运行之后。

    var query = (from p in Productions
    join t in MaterialTransactions
        on p.Prodn_ID equals t.Prodn_ID
    where p.WO_ID == 2345
    orderby p.Date descending
    select new  {
        Id = p.Prodn_ID,
        Date = p.Date,
        Line1 = p.ProdLine.Factory.Factory_No,
        Line2 = p.ProdLine.ProdLine_No,
        Qty = p.Qty,
        Wgt = (double)p.ActWgt,
        Speed = (double)p.ActSpeed,
        MaterialUsed = t.Material.Name
    })
    .AsEnumerable()
    // This is where the db-stuff stops, and the in-memory stuff begins
    .Select(p => new {
        p.Id,
        p.Date,
        Line = p.Line1 + '/' + p.Line2.ToString(),
        p.Qty,
        p.Wgt,
        p.Speed,
        p.MaterialUsed
    });
    
    var result = query.ToList();
    

    【讨论】:

      【解决方案3】:

      如果你想在 linq to entity 中将数值转换为字符串,你必须使用SqlFunctions(ToString() 会失败)

      (p.ProdLine.Factory.Factory_No + '/' + p.ProdLine.ProdLine_No.ToString())
      

      应该是

      SqlFunctions.StringConvert((double)p.ProdLine.Factory.Factory_No) + '/' + SqlFunctions.StringConvert((double)p.ProdLine.ProdLine_No);
      

      您必须将数值转换为双精度(或小数),因为 StringConvert 以 int 作为参数没有重载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多