1

经过数小时的研究,我仍然无法缩短此查询,但肯定有办法......我当前的查询看起来像这样

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;

我最初试图完成的是一个 all in 1 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());
4

1 回答 1

4

问题在这里:

.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 为或 0,您将得到一个被零除的异常。null我建议:

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最近在他的博客上发布了关于 null 合并优先级的文章。

于 2013-10-31T15:55:01.627 回答