C# 延迟加载实体框架6中的数据,MySql不工作
我正在使用MySql进行一个代码优先的EF6项目。我已经设置了我的数据类,这样它们的相关数据对象应该是延迟加载的,但是每次调用它们时,它们似乎运行得非常慢 这是我的一个实体类的示例:C# 延迟加载实体框架6中的数据,MySql不工作,c#,mysql,entity-framework,entity-framework-6,code-first,C#,Mysql,Entity Framework,Entity Framework 6,Code First,我正在使用MySql进行一个代码优先的EF6项目。我已经设置了我的数据类,这样它们的相关数据对象应该是延迟加载的,但是每次调用它们时,它们似乎运行得非常慢 这是我的一个实体类的示例: [Table("Carrier")] public class DBCarrier { [Key] [Column("CarrierId")] public int carrierId { get; set; } [MaxLength(128), Required] pub
[Table("Carrier")]
public class DBCarrier
{
[Key]
[Column("CarrierId")]
public int carrierId { get; set; }
[MaxLength(128), Required]
public string CarrierName { get; set; }
public virtual ICollection<DBDepot> Depots { get; set; }
public virtual ICollection<DBZone> Zones { get; set; }
}
每次我打电话给carrier.Zones大约需要8秒钟。我认为将
区域定义为ICollection会延迟数据库查询的执行。ICollection
意味着数据肯定已经在内存中具体化了。获得所需行为的唯一方法是使用支持延迟执行的接口,只有两种:
- 查询是使用
表达式构建的,用于对远程数据源(例如sql数据库)发起查询
- 查询是使用
委托创建的,用于对内存中已有的数据集进行查询
当您使用First()
、FirstOrDefault()
、ToList()
或ToArray()
迭代数据时,使用这两种接口类型中的任何一种都会导致执行查询
但是,看到您只需要区域的名称,您的查询效率很低。获取整个DBZone
对象,但只获取名称,我建议只获取名称:
return carrier.Zones.FirstOrDefault(z => z.Postcode == postcode).Select(z => z.ZoneName);
为此,您当然需要将carrier
保留为IQueryable
编辑:刚刚注意到“每次我给carrier.Zones打电话,运行大约需要8秒。”
这是延迟加载的预期行为。当您访问数据库时,将从数据库中获取数据=>运营商的数据库调用,当您访问区域时,将为区域调用另一个数据库调用。这可以通过使用即时加载(Include
method)来避免,以便在数据库的一次访问中获得所有所需的数据。是有意义的。我以后再试试。
return carrier.Zones.FirstOrDefault(z => z.Postcode == postcode).Select(z => z.ZoneName);