0

谁能告诉我为什么这在 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’的常量值。在此上下文中仅支持原始类型或枚举类型。”

4

3 回答 3

1

几天前我遇到的重复问题: 使用 Entity Framework 5 在 SQL Server 中连接字符串和数字的最佳方法?

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

于 2013-09-09T12:50:11.360 回答
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();
于 2013-09-09T12:27:06.483 回答
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);

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

于 2013-09-09T12:39:45.977 回答