如何使Linq语句更复杂
经过数小时的研究,我仍然无法缩短此查询,但肯定有一种方法。。。我当前的查询看起来是这样的如何使Linq语句更复杂,linq,linq-to-entities,Linq,Linq To Entities,经过数小时的研究,我仍然无法缩短此查询,但肯定有一种方法。。。我当前的查询看起来是这样的 decimal Cost = db.U_MBP .Where(w => w.Model == ModelNumber) .Select(s => s.Cost ?? 0) .FirstOrDefault(); double Margin = db.U_MBP .Where(w => w.Model == ModelNumber) .Select(s
decimal Cost = db.U_MBP
.Where(w => w.Model == ModelNumber)
.Select(s => s.Cost ?? 0)
.FirstOrDefault();
double Margin = db.U_MBP
.Where(w => w.Model == ModelNumber)
.Select(s => s.Margin ?? 0)
.FirstOrDefault();
decimal BasePrice = Cost / (decimal)Margin;
我最初试图实现的是一个全合一linq语句,类似于
decimal BasePrice = db.U_MBP
.Where(w => w.Model == ModelNumber)
.Select(s => s.Cost ?? 0 / (decimal)s.Margin ?? 0)
.FirstOrDefault();
但我无法克服演员的错误
在LINQ to Entities查询中不支持转换为十进制,因为无法推断所需的精度和比例信息。
你们谁能帮忙
在D的帮助下回答
decimal BasePrice = (decimal)(db.Utilities_ModelsBasePrices
.Where(w => w.Model == ModelNumber)
.Select(s => (s.Margin == null || s.Margin == 0) ? (double)0m :
((double)s.Cost) / (double)s.Margin)
.FirstOrDefault());
问题在于:
.Select(s => s.Cost ?? 0 / (decimal)s.Margin ?? 0)
??
运算符的优先级低于/
运算符,因此它可以有效地计算:
.Select(s => s.Cost ?? (0 / (decimal)s.Margin) ?? 0)
也就是说
if (s.Cost == null)
if((0 / (decimal)s.Margin))== null
return 0;
else
return (0 / (decimal)s.Margin);
else
return s.Cost;
使用??
和其他运算符时,需要添加参数:
decimal BasePrice = db.U_MBP
.Where(w => w.Model == ModelNumber)
.Select(s => (s.Cost ?? 0) / ((decimal)s.Margin ?? 0))
.FirstOrDefault();
但是,如果s.Margin为null
或0,您将得到一个被零除的异常。我建议:
decimal BasePrice = (decimal)(db.U_MBP
.Where(w => w.Model == ModelNumber)
.Select(s => (s.Margin == null || s.Margin == 0) ? 0.0 :
((double)s.Cost ?? 0) / s.Margin)
.FirstOrDefault());
Eric Lippert在他的博客上谈到了空合并优先级。问题在于:
.Select(s => s.Cost ?? 0 / (decimal)s.Margin ?? 0)
??
运算符的优先级低于/
运算符,因此它可以有效地计算:
.Select(s => s.Cost ?? (0 / (decimal)s.Margin) ?? 0)
也就是说
if (s.Cost == null)
if((0 / (decimal)s.Margin))== null
return 0;
else
return (0 / (decimal)s.Margin);
else
return s.Cost;
使用??
和其他运算符时,需要添加参数:
decimal BasePrice = db.U_MBP
.Where(w => w.Model == ModelNumber)
.Select(s => (s.Cost ?? 0) / ((decimal)s.Margin ?? 0))
.FirstOrDefault();
但是,如果s.Margin为null
或0,您将得到一个被零除的异常。我建议:
decimal BasePrice = (decimal)(db.U_MBP
.Where(w => w.Model == ModelNumber)
.Select(s => (s.Margin == null || s.Margin == 0) ? 0.0 :
((double)s.Cost ?? 0) / s.Margin)
.FirstOrDefault());
Eric Lippert在他的博客上发布了关于空合并优先级的信息。您能发布您得到的确切错误吗?另外,
(十进制)s.Margin??0
是一个等待发生的除以零的错误…您不需要将?
分组到括号中,以便在最后一个代码片段中正确关联吗?@AbeMiessler是的,我只是想先让它工作,错误:LINQ to Entities查询中不支持转换为十进制,因为无法推断所需的精度和比例信息。请公布您得到的准确误差,好吗?另外,(十进制)s.Margin??0
是一个等待发生的除以零的错误…您不需要将?
分组到括号中,以便在最后一个代码片段中正确关联吗?@AbeMiessler是的,我只是想先让它工作,错误:LINQ to Entities查询中不支持转换为十进制,因为无法推断所需的精度和比例信息。答案中的最后一个查询出错:LINQ to Entities查询中不支持转换为十进制,因为无法推断所需的精度和比例信息。我已将其修改为双精度,然后转换为十进制。非常感谢,我不得不对其进行了细微的调整以使其正常工作:)我将编辑我的帖子,非常感谢!!回答中的上一个查询出错:在LINQ to Entities查询中不支持转换为十进制,因为无法推断所需的精度和比例信息。我已将其修改为双精度,然后转换为十进制。非常感谢,我不得不对其进行微调以使其正常工作:)我将编辑我的帖子,非常感谢!!