2013-10-31 133 views
1

多小時的研究後,我仍然不能得到這個查詢縮短,但肯定是有辦法......我現在的查詢看起來像這樣我怎樣才能使這個LINQ的聲明更復雜的

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; 

我最初試圖完成的是一個所有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查詢中不支持投射到Decimal。

你們能幫忙嗎?

答案與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()); 
+2

你能否發佈你正在得到的確切錯誤?另外,'(十進制)s.Margin ?? 0'是一個零等於零的錯誤發生等待發生...... –

+0

你不需要在括號中將'??'放在最後一個代碼片段的正確關聯性中嗎? – akonsu

+0

@AbeMiessler是的,我只是試圖讓它首先工作,但錯誤:鑄造到十進制不支持LINQ to Entities查詢,因爲無法推斷出所需的精度和比例信息** – Pakk

回答

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是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 recently posted關於他的博客上的空合併優先順序。

+0

錯誤您的答案中包含最後一個查詢:由於無法推斷所需的精度和比例信息,因此在LINQ to Entities查詢中不支持投射到Decimal。 – Pakk

+0

我已經修改它做一個double的數學然後轉換爲小數。 –

+0

非常感謝,我不得不稍微調整它,讓它工作:)生病編輯我的帖子,非常感謝! – Pakk