2017-07-03 50 views
-1

我需要檢查FirstOrDefault()是否爲空,如果不是,請採取一些屬性。我最好的選擇是:c#lambda採取FirstOrDefault屬性,如果它不爲null

var results = Database.Set<Pizzas>().Select(x => new PizzaViewModel 
{ 
    Base = Database.Set<Bases>().FirstOrDefault(y => y.Id == x.Base.Id) != null ? Database.Set<Bases>().FirstOrDefault(y => y.Id == x.Base.Id).Name : null 
}).ToList(); 

有沒有更好的方法來做到這一點?

+0

@BalagurunathanMarimuthu再一次,這不是重複的。不要丟棄那些不是問題答案的副本。 –

+0

這看起來像一個自定義實現的外連接。你可能會考慮讀入[外連接](https://stackoverflow.com/questions/3404975/left-outer-join-in-linq)。 –

+1

@BalagurunathanMarimuthu dublicate你提供的並不回答我的問題,因爲所有的答案都提供了類似的查詢我的 – mazas17

回答

4

您可以在FirstOrDefault()使用空傳播運營商:

Base = Database.Set<Bases>().FirstOrDefault(y => y.Id == x.Base.Id)?.Name 
+0

它很好地獲得一個屬性,如何實現'採取一些屬性'/?讓它成爲一些'名稱'和'年齡' –

+0

「某些財產」是單數的,對嗎? @不幸的「屬性」是複數。 –

+1

它可能是值得一提的c#版本的要求 - 有些人是由於各種原因卡住使用舊版本不支持這一點。 :( – Chris

0

你可以做這樣的C#< 6.0:

Base = Database.Set<Bases>().Where(y => y.Id == x.Base.Id) 
          .Select(y=> y.Name).FirstOrDefault(); 

否則,您可以使用空,條件運算符(? )運營商之前.Name

3

由於有人提到了多個屬性,我會將其添加到t他允許我們保留底座,以便我們可以查詢多個事物,並且無效傳播操作符允許我們確保在沒有找到底座的情況下我們不會中斷。

var bases = Database.Set<Bases>(); 
var results = 
    (from pizza in Database.Set<Pizzas>() 
    let pizzaBase = bases.FirstOrDefault(pizzaBase => pizzaBase.Id == pizza.Base.Id) 
    select new PizzaViewModel { 
     Base = pizzaBase?.Name, 
     BaseIngredients = pizzaBase?.Ingredients 
    }).ToList(); 
相關問題