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#的主要内容,如果未能解决你的问题,请参考以下文章