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
"无法创建类型为'系统.对象'的常量值。在此上下文中仅支持基元类型或枚举类型。
几天前我遇到的重复问题:使用实体框架 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 作为参数。