簡體   English   中英

Linq to Entities-“無法創建類型'System.Object'的常量值...”

[英]Linq to Entities - “Unable to create a constant value of type 'System.Object'…”

誰能告訴我為什么這在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'的常量值。在此上下文中僅支持原始類型或枚舉類型。”

我前幾天有一個重復的問題: 使用Entity Framework 5在SQL Server中連接字符串和數字的最佳方法?

我創建了ExpressionVisitor來解決該問題,因此我可以編寫簡潔的代碼並在單個查詢中盡可能多地運行。 (包含在答案中)

我認為是導致問題的以下行:

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

如果要將數值轉換為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參數沒有重載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM