我的查询有问题
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 :(得分: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)