![](/img/trans.png)
[英]Any way to work around linq2Entities exception - Unable to create a constant value of type '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中的字符串到實體,則必須使用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參數沒有重載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.