如何使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查询中不支持转换为十进制,因为无法推断所需的精度和比例信息。我已将其修改为双精度,然后转换为十进制。非常感谢,我不得不对其进行微调以使其正常工作:)我将编辑我的帖子,非常感谢!!