如何将字符串与十进制连接?

时间:2014-07-10 07:36:56

标签: c# sql linq

我在tbl_BillingTerm中有2列

  1. BTTitle(VARCHAR(MAX))
  2. BTBill(钱)

  3. 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."
    

2 个答案:

答案 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)
        });
}