我在tbl_BillingTerm中有2列
using (var db = new ClothEntities())
{
var data = (from bterm in db.tbl_BillingTerm
select new
{
bterm.BTId,
BillingTerm = bterm.BTTitle +""+ bterm.BTBill+": USD/month"
}).ToList();
}
我想连接Title和Bill,如图所示,我使用LINQ编码。 它会产生错误:
> "Unable to cast the type 'System.Decimal' to type 'System.Object'.
LINQ to Entities only supports casting EDM primitive or enumeration types."
答案 0 :(得分:3)
代替,
using (var db = new ClothEntities())
{
var raw = (from bterm in db.tbl_BillingTerm
select new
{
bterm.BTId,
bterm.BTTitle,
bterm.BTBill
}).ToList();
var data = raw.Select(bterm => new
{
bterm.BTId,
BillingTerm = string.Format(
"{0} {1}: USD/month",
bterm.BTTitle,
bterm.BTBill)
});
}
实质上,使用EF获取数据然后,使用linq-to-objects进行笨拙的字符串操作。
EF提供商不会解释ToList()
之后的所有内容。
或者,如果你真的想做这个服务器端,你可以试试,
using (var db = new ClothEntities())
{
var data = (from bterm in db.tbl_BillingTerm
select new
{
bterm.BTId,
BillingTerm =
bterm.BTTitle + " " +
SqlFunctions.StringConvert(bterm.BTBill)
+ ": USD/month")
});
}
这使用EF提供程序应该映射到适当的规范TSQL函数的SQLFunctions
类。
在这种情况下,我认为第二种方法没什么价值。上面的拆分解决方案导致更密集的结果集被传输到客户端。进程间通信的成本可能远高于结果的第二次迭代。
答案 1 :(得分:0)
int to string casting没有mapping to a Canonical Function。
如果此错误阻止您前进并且是一个小型数据集,您可以通过枚举查询(call ToList
)来保证从数据库中检索。从那时起,您的操作将针对内存中的对象,您可能不会遇到您收到的错误。
using (var db = new ClothEntities())
{
var result = (from bterm in db.tbl_BillingTerm
select new
{
bterm.BTId,
bterm.BTTitle,
bterm.BTBill
}).ToList();
var data = result.Select(bterm => new
{
bterm.BTId,
BillingTerm = string.Format(
"{0} {1}: USD/month",
bterm.BTTitle,
bterm.BTBill)
});
}