2017-03-23 92 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)