2017-03-23 111 views
0

的第一個對象我有一個問題,我的查詢Linq查詢 - 獲得相關實體

var ninjas = from n in this.dbContext.Ninjas 
         join e in this.dbContext.Equipment on n.Id equals e.NinjaId 
         select (new NinjaModel() 
         { 
          Id = n.Id, 
          Name = n.Name, 
          FirstEquipmentItemName = n.Equipment.FirstOrDefault()?.Name, 
          BornDate = DbFunctions.TruncateTime(n.BornDate).Value 
         }); 

我不能在我的查詢中使用FirstOrDefault和我想的忍者裝備第一個項目的名稱出現。可能嗎?我知道我可以使用

this.dbContext.Ninjas.AsEnumerable() 

但是然後DbFunctions.TruncateTime不會工作。

+0

你想在BornDate屬性中做什麼? – Vignesh

+3

爲什麼你不能使用FirstOrDefault? –

+1

毆打我9秒,@SergeyBerezovskiy –

回答

2

你的問題驗證,實際上是存在在位置0的元素是查詢空條件運算符的用法:

FirstEquipmentItemName = n.Equipment.FirstOrDefault()?.Name 

這會給出錯誤

表達式樹lambda可能不包含空傳播 運算符。

你需要什麼 - 只需得到沒有空條件運算符的名稱。在如果沒有相關的entites情況下,名稱將具有null值:

FirstEquipmentItemName = n.Equipment.FirstOrDefault().Name 

發生了什麼幕後 - EF生成SQL查詢從相關表返回TOP(1)設備名稱。例如:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name], 
    (SELECT TOP (1) 
     [Extent2].[Name] AS [Name] 
     FROM [dbo].[Equipment] AS [Extent2] 
     WHERE [Extent1].[Id] = [Extent2].[Id]) AS [C1] 
    FROM [dbo].[Ninjas] AS [Extent1] 
+0

不會拋出'NullReferenceException'嗎? –

+0

@EricWu它工作正常,謝謝謝爾蓋 – kriss

+1

@EricWu nope。不要將EF表達式視爲C#代碼。這是一個永遠不會被執行的表達式樹。它將被轉換爲SQL查詢。而且..你不能有NullReferenceException那裏 –

1

您可以使用.ElementAt(0),它將返回查詢中的第一個元素。
您可以通過使用if (ninjas.Count() > 0)