2017-06-21 67 views
9

質問:次のコードのprice = co?.price ?? 0,行に上記のエラーが表示されます。しかし、co.?から?を削除してもうまくいきます。私はthis MSDN exampleに従うことを試みていたところの?を使用しているので、をいつ使うべきかを理解する必要があると思われます。式ツリーラムダには、伝搬演算子が含まれていない可能性があります。

エラー

暗黙のラムダ式式ツリーラムダは、あなたがから引用された例では、オブジェクトにLINQを使用してヌル伝搬オペレータ

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

を含めることはできませんクエリ内で代理人 ...に変換されますが、EFなどを使用しているのに対して、IQueryable<T>クエリでは、ラムダ式は式ツリーに変換されます。式ツリーは、NULL条件付き演算子(またはタプル)をサポートしていません。

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

(私がnullで合体演算子は式ツリー内の罰金であると考えています。)

+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

関連する問題