linq中的算术运算使用实体框架mvc C#

Posted

技术标签:

【中文标题】linq中的算术运算使用实体框架mvc C#【英文标题】:arithmatic operation in linq using entity framework 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 含义完全不同)但如果错误不是语法错误,则通常是仅仅通过阅读代码是不可能知道的。 【参考方案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 我已经更新了答案。如果有用并解决您的问题,请接受答案。 我通过更改数据库中的数据类型解决了这个问题

以上是关于linq中的算术运算使用实体框架mvc C#的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用列中的算术运算符通过字符串查询 DataTable

Java中的运算符

算术运算中的上溢或下溢

C#中的大数组算术

算术和关系运算符

第04章 运算符