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

时间:2013-09-09 12:17:43

标签: c# linq entity-framework

任何人都可以告诉我为什么这在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'的常量值。在此上下文中仅支持基本类型或枚举类型。”

3 个答案:

答案 0 :(得分:1)

几天前我有什么问题: Best way to concat strings and numbers in SQL server using Entity Framework 5?

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果要将数值转换为linq中的字符串到实体,则必须使用SqlFunctionsToString()将失败)

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

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