Linq查询 - 获取相关实体的第一个对象

时间:2017-03-23 12:32:50

标签: c# entity-framework 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不会工作。

2 个答案:

答案 0 :(得分:2)

您的问题是在查询中使用空条件运算符:

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]

答案 1 :(得分:1)

您可以使用.ElementAt(0)来返回查询中的第一个元素。
您可以使用if (ninjas.Count() > 0)

验证位置0上是否存在实际元素