gpt4 book ai didi

c# - Entity Framework .Any() 正在返回完整的表格

转载 作者:行者123 更新时间:2023-11-30 21:43:41 24 4
gpt4 key购买 nike

我很确定我只是愚蠢得可笑,但我似乎无法弄清楚...

我首先在 EF6 代码中有以下对象:

public class Vessel
{
public int Id {get;set;}
public string Name {get;set;}
public virtual ICollection<Position> Positions {get;set;}
}

public class Position
{
public int Id {get;set;}
public double Lat {get;set;}
public double Lon {get;set;}

public virtual Vessel Vessel {get;set;}
}

我正在做以下事情:

var vess = context.Vessels.First();

if (vess.Positions.Any())
{
// Do something spiffy
}

我在 Rhinos 中对此进行分析,并生成了以下 SQL:

SELECT [Extent1].[Id]                AS [Id],
[Extent1].[VesselId] AS [VesselId],
[Extent1].[Lat] AS [Lat],
[Extent1].[Lon] AS [Lon]
FROM [dbo].[Position] AS [Extent1]
WHERE [Extent1].[VesselId] = 1 /* @EntityKeyValue1 */

我的问题是,为什么?我还不如写:

if (vess.Positions.Count() > 0)

就像我说的,我确定我只是在装傻。

最佳答案

Positions被定义为 ICollection<Position> ,编译器正在绑定(bind) AnyEnumerable (Linq-to-objects) 扩展方法,它只检查集合中是否存在某个项目。通过这样做,它调用了虚拟 Positions 的 getter。该属性已被 EF 覆盖,以通过生成您看到的 SQL 来加载集合的完整 内容。

I might as well have written if (vess.Positions.Count() > 0)

不,出于同样的原因,那会做同样的事情。

如果这真的是个问题,而且不是您所期望的,您必须构建等效的 EF 查询:

var positions = context.Positions
.Where(p => p.VesselId == vess.Id);

if (positions.Any())
{
// Do something spiffy
}

但我不会说如果“一些漂亮的东西”需要用 Positions 做某事属性内容,您不妨将其加载到 if 中就像您现在正在做的那样。

关于c# - Entity Framework .Any() 正在返回完整的表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41467414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com