【问题标题】:arithmatic operation in linq using entity framework mvc C#linq中的算术运算使用实体框架mvc C#
【发布时间】:2019-04-19 14:42:29
【问题描述】:

在下面的方法中,我必须根据以下公式计算最终价格,但这给了我一个错误。如何使用以下查询进行以下操作?

public JsonResult GetAllPanditBookList()
{
    var plist= db.TB_PBooking.Select(hc => new { 
        hc.PB_ID, 
        hc.PB_PRICE, 
        hc.PB_SPRICE, 
        hc.USER_ID,  
        hc.REG_DATE, 
        hc.STATUS,
        ((hc.PB_PRICE *hc.PB_SPRICE) /100) as FinalPrice,
        hc.PAYMENT_TYPE,
        hc.TB_UserReg.FULL_NAME,
        USERMOB=hc.TB_UserReg.MOBILE_NO 
    }).OrderByDescending(x => x.PB_ID).ToList();

    return Json(_templeList, JsonRequestBehavior.AllowGet);
}

【问题讨论】:

  • 总是花时间正确格式化您的问题,这将有助于其他人清楚地阅读和理解。人们通常会忽略格式不正确的问题。
  • 好的,谢谢你的建议,我一定会改进的
  • 另外,如果您有错误,您应该准确提及错误消息的内容,以及抛出错误的行。仅从代码中并不总是可以分辨出来,当您已经知道信息时,我们不应该花时间尝试解决它。在这里,您似乎将 SQL 语法与 C# 语法混淆了(您应该查看 as 关键字在 C# 中的作用,其含义与 SQL 含义完全不同)但如果错误不是语法错误,则通常是仅仅通过阅读代码是不可能知道的。

标签: c# json entity-framework linq lambda


【解决方案1】:

尝试以下方法:

public JsonResult GetAllPanditBookList()
{
    var plist= db.TB_PBooking.Select(hc => new 
    { 
        hc.PB_ID, 
        hc.PB_PRICE, 
        hc.PB_SPRICE, 
        hc.USER_ID,  
        hc.REG_DATE, 
        hc.STATUS,
        FinalPrice = hc.PB_PRICE * hc.PB_SPRICE /100,
        hc.PAYMENT_TYPE,
        hc.TB_UserReg.FULL_NAME,
        USERMOB = hc.TB_UserReg.MOBILE_NO 
    })
    .OrderByDescending(x => x.PB_ID)
    .ToList();

    return Json(_templeList, JsonRequestBehavior.AllowGet);
}

更新:

如果您需要将价格从 string 转换为 int,您应该更改数据库中这些列的类型。

您应该可以通过以下方式将string 解析为int(请注意我没有测试此代码):

var plist= db.TB_PBooking.Select(hc => new 
    { 
        hc.PB_ID, 
        hc.PB_PRICE, 
        hc.PB_SPRICE, 
        hc.USER_ID,  
        hc.REG_DATE, 
        hc.STATUS,
        hc.PB_PRICE,
        hc.PB_SPRICE,
        hc.PAYMENT_TYPE,
        hc.TB_UserReg.FULL_NAME,
        USERMOB=hc.TB_UserReg.MOBILE_NO             
    })
    .OrderByDescending(x => x.PB_ID)
    .AsEnumerable()
    .Select(hc => new 
    { 
        hc.PB_ID, 
        hc.PB_PRICE, 
        hc.PB_SPRICE, 
        hc.USER_ID,  
        hc.REG_DATE, 
        hc.STATUS,
        FinalPrice = (int.Parse(hc.PB_PRICE) * int.Parse(hc.PB_SPRICE)) /100,
        hc.PAYMENT_TYPE,
        hc.FULL_NAME,
        hc.USERMOB 
    })
    .ToList();

AsEnumerable() 之前调用.OrderByDescending(x => x.PB_ID) 可以让数据库对结果进行排序。

【讨论】:

  • 如何在上面的表达式中将字符串值转换为 int,因为 PB_PRICE 和 PB_SPRICE 是字符串格式
  • @MANGESHUKADE 只是cast them to int (or maybe decimal, if that's more suitable)。但是为什么要将数字作为字符串存储在数据库中呢?这才是真正的问题。修复你的底层数据结构,一切都会变得容易得多。
  • FinalPrice = Convert.ToInt64(hc.PB_PRICE) * Convert.ToInt64(hc.PB_SPRICE) 作为附加信息给出错误:LINQ to Entities 无法识别方法 'Int64 ToInt64(System.String) ' 方法,并且该方法不能翻译成商店表达式。
  • 试试 int.Parse(hc.PB_PRICE)
【解决方案2】:

首先,正如@Thangadurai 所提到的,请花点时间对您提出的问题进行很好的解释。

建议为您的结果对象创建一个 DTO 并返回 DTO,如下所示

      public class PanditBookDTO
      {
            int PB_ID;
            string hc.PB_PRICE;
            string hc.PB_SPRICE;
            int hc.USER_ID;
            DateTime hc.REG_DATE; 
            int hc.STATUS;
            int FinalPrice;
            hc.PAYMENT_TYPE;
            string FULL_NAME;
            string USERMOB
      }

并使用这个类如下:

    public JsonResult GetAllPanditBookList()
    {
        var plist= db.TB_PBooking.Select(hc => new PanditBookDTO()
        { 
            hc.PB_ID, 
            hc.PB_PRICE, 
            hc.PB_SPRICE, 
            hc.USER_ID,  
            hc.REG_DATE, 
            hc.STATUS,
            FinalPrice = (Convert.ToInt32(hc.PB_PRICE) * Convert.ToInt32(hc.PB_SPRICE)) /100,
            hc.PAYMENT_TYPE,
            hc.TB_UserReg.FULL_NAME,
            USERMOB = hc.TB_UserReg.MOBILE_NO 
        })
        .OrderByDescending(x => x.PB_ID)
        .ToList();

        return Json(_templeList, JsonRequestBehavior.AllowGet);
    }

即使将来您要更改查询,您的回复也将是类型安全的。

【讨论】:

  • 出现错误 LINQ to Entities 无法识别方法 'Int32 Parse(System.String)' 方法,并且该方法无法转换为存储表达式。
  • @MANGESHUKADE 我已经更新了答案。如果有用并解决您的问题,请接受答案。
  • 我通过更改数据库中的数据类型解决了这个问题
猜你喜欢
  • 2010-11-05
  • 2011-11-02
  • 1970-01-01
  • 2014-09-12
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多