2017-06-21 231 views
9

問題:下面的代碼行price = co?.price ?? 0,給我上面的錯誤。但如果我從co.?刪除?它工作正常。我試圖按照this MSDN example他們在哪裏使用?在線select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };所以,我似乎需要了解何時使用???和什麼時候不使用。表達式樹lambda可能不包含空傳播運算符

錯誤

表達式樹lambda不能包含空傳播算子

public class CustomerOrdersModelView 
{ 
    public string CustomerID { get; set; } 
    public int FY { get; set; } 
    public float? price { get; set; } 
    .... 
    .... 
} 
public async Task<IActionResult> ProductAnnualReport(string rpt) 
{ 
    var qry = from c in _context.Customers 
       join ord in _context.Orders 
       on c.CustomerID equals ord.CustomerID into co 
       from m in co.DefaultIfEmpty() 
       select new CustomerOrdersModelView 
       { 
        CustomerID = c.CustomerID, 
        FY = c.FY, 
        price = co?.price ?? 0, 
        .... 
        .... 
       }; 
    .... 
    .... 
} 
+0

請發佈錯誤... –

+0

我希望C#支持這個人! – nawfal

回答

21

你是從引用的示例使用LINQ到對象,其中,所述隱式lambda表達式在查詢中轉換成代表 ...而您使用的是EF或類似的,IQueryable<T>查詢,其中lambda表達式被轉換成表達樹。表達式樹不支持空條件運算符(或元組)。

只是做舊的方式:(我相信空合併運算符是一個表達式樹罰款)

price = co == null ? 0 : (co.price ?? 0) 

+0

謝謝。你回答我的[this](https://stackoverflow.com/q/44681042/1232087)'SO'問題。 – nam

3

您鏈接到應用List<T>的代碼。 List<T>執行IEnumerable<T>但不是IQueryable<T>。在這種情況下,投影在內存中執行並?.工作。

您正在使用一些IQueryable<T>,其工作原理有所不同。對於IQueryable<T>,投影的表示被創建,並且您的LINQ提供者決定在運行時如何處理它。出於向後兼容性的原因,此處不能使用?.

根據您的LINQ提供商,您可以使用普通的.,但仍未獲得任何NullReferenceException

+0

您回答了我的[this](https://stackoverflow.com/q/44681042/1232087)'SO'問題。謝謝。 – nam

+0

@ hvd你能解釋爲什麼這是向後兼容性所必需的嗎? – jag

+1

@jag在引入'?.'之前已經創建的所有LINQ提供者都不會準備好以任何合理的方式處理'。.'。 – hvd