2017-06-05 3 views
1

まず、他の既存のものと同様の質問を投稿しても構いませんが、C#を初めて使用してLINQを把握し始めました。 2つのテーブルにまたがって1つの行のフィールドを取得するビジネスロジックがあります。そのような行が存在しない場合、デフォルトでは空のStringにする必要があります。 LINQ外 これは簡単だろう:Expression-Treeラムダのヌルチェックへの適切な方法

var res = SomeClass.foo?.bar ?? ""; 

しかし、LINQでの演算子?.??がサポートされていないので、私はこれに頼っ:

私は二回クエリを行う
 var projectTask = repository.Set<tblProject>().Where(p => includeInactive || 
          (p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Deducted && 
          p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Deduc_RestDecays && 
          p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Cancelled)) 
          .Select(p => new { 
           p.ID, 
           p.CustomerID, 
           p.CenterID, 
           p.FrameworkID, 
           p.DeductionmodeID, 
           p.Code, 
           p.Descriptioln, 
           p.StartDate, 
           p.EndDate, 
           Referencetext = p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1).OrderByDescending(m => m.Date).FirstOrDefault() != null ? 
           p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1).OrderByDescending(m => m.Date).FirstOrDefault().Referencetext : "" 
          }) 
          .ToListAsync(); 

「にISNましたこの場合のパフォーマンスの低下は、それほどエレガントではありません。

私はExpressionでLINQ式を構築できることを理解していますが、私のケースの例はあまりありません。

ありがとうございます。

答えて

2

しかし、LINQでの演算子?.??

をサポートしていません(代表者との)IEnumerableに対するLINQの両方がサポートされているので、私はあなたが(式ツリー内の)IQueryableに対してLINQを意味し、ここでLINQによって推測。

?.演算子が式ツリーでサポートされていないことは間違いありませんが、??は完全にサポートされています。

は、もしそうなら、質問はこの式のためです:

Referencetext = 
    p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1) 
     .OrderByDescending(m => m.Date).FirstOrDefault() != null ? 
    p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1) 
     .OrderByDescending(m => m.Date).FirstOrDefault().Referencetext : "" 

それは簡単Selectの組み合わせで扱うことができ、FirstOrDefault??オペレータ:

Referencetext = p.tblOrderHistories 
    .Where(m => m.OrderReferencetypeID == 1) 
    .OrderByDescending(m => m.Date) 
    .Select(m => m.Referencetext) 
    .FirstOrDefault() ?? "" 
+0

ありがとう!しかし '.FirstOrDefault()'はnullを返すでしょうか? – drilow

+0

null可能な型の場合、絶対に( 'null'は' XyzOrDefault'の中の 'Default'の意味です) –

+0

それは意味があります。 – drilow