Linq to Entities - “无法创建类型为'System.Object'的常量值."

本文关键字:System Object quot 常量 Entities to 类型 创建 Linq | 更新日期: 2023-09-27 18:30:37

谁能告诉我为什么这在 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"无法创建类型为'系统.对象'的常量值。在此上下文中仅支持基元类型或枚举类型。

Linq to Entities - “无法创建类型为'System.Object'的常量值."

几天前我遇到的重复问题:使用实体框架 5 在 SQL 服务器中连接字符串和数字的最佳方法?

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

我认为是

以下行导致了问题:

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

这是因为它将查询结果与 .NET 方法结果组合在一起。

也许这会起作用。它会延迟行变量内容的创建,直到运行查询之后。

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();

如果要在 linq 中将数值转换为字符串到实体,则必须使用 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 作为参数。