Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询-获取相关实体的第一个对象_C#_Entity Framework_Linq - Fatal编程技术网

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

C# Linq查询-获取相关实体的第一个对象,c#,entity-framework,linq,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

我的查询有问题

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不起作用。

您可以使用
.ElementAt(0)
,它将从查询中返回第一个元素。
您可以使用
if(ninjas.Count()>0)验证位置0处是否确实存在元素。
您可以使用
.ElementAt(0)
它将从查询中返回第一个元素。
如果(ninjas.Count()>0)您的问题是在查询中使用null条件运算符,则可以使用
验证位置0处是否存在元素:

FirstEquipmentItemName = n.Equipment.FirstOrDefault()?.Name
这将产生一个错误

表达式树lambda不能包含null传播 接线员

您需要的是-只需获取不带null条件运算符的名称。如果没有相关的实体,名称将具有
null
值:

FirstEquipmentItemName = n.Equipment.FirstOrDefault().Name
场景背后发生的事情-EF生成SQL查询,从相关表中返回前(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]

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

FirstEquipmentItemName = n.Equipment.FirstOrDefault()?.Name
这将产生一个错误

表达式树lambda不能包含null传播 接线员

您需要的是-只需获取不带null条件运算符的名称。如果没有相关的实体,名称将具有
null
值:

FirstEquipmentItemName = n.Equipment.FirstOrDefault().Name
场景背后发生的事情-EF生成SQL查询,从相关表中返回前(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]

你想在BornDate属性中做什么?为什么不能使用FirstOrDefault?比我快9秒,@SergeyBerezovskiyBornDate是DateTimeOffset,我想从中截短时间。你知道你可以将整个查询包装在
()
中,并对其执行
.FirstOrDefault()
,对吗?你想在BornDate属性中做什么?为什么你不能使用FirstOrDefault?比我快9秒,@SergeyBerezovskiyBornDate是DateTimeOffset,我想从这里截短时间。你知道你可以将整个查询包装在
()
中,并对其执行
.FirstOrDefault()
,对吗?这不会抛出一个
NullReferenceException
?@EricWu-nope。不要把EF表达式看作是C#代码。这是一个永远不会执行的表达式树。它将被转换为SQL查询。和。。不能有NullReferenceExceptionthere@kriss请注意,此技巧不适用于不可为空的类型。若sql查询在相关表中找不到任何数据,它将返回NULL作为字段值,但不会抛出
NullReferenceException
?@EricWu nope。不要把EF表达式看作是C#代码。这是一个永远不会执行的表达式树。它将被转换为SQL查询。和。。不能有NullReferenceExceptionthere@kriss请注意,此技巧不适用于不可为空的类型。若sql查询在相关表中找不到任何数据,它将返回NULL作为字段值