gpt4 book ai didi

c# - 使用 Entity Framework 提高效率

转载 作者:太空狗 更新时间:2023-10-29 23:01:26 26 4
gpt4 key购买 nike

我一直在使用 Entity Framework 和 POCO First 方法。我几乎遵循 Steve Sanderson 在他的书“Pro ASP.NET MVC 3 Framework”中描述的模式,使用 DI 容器和 DbContext 类连接到 SQL Server。

SQL Server 中的基础表包含由不同应用程序使用的非常大的数据集。因此,我不得不为我的应用程序中需要的实体创建 View :

class RemoteServerContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Contact> Contacts { get; set; }
...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().ToTable("vw_Customers");
modelBuilder.Entity<Order>().ToTable("vw_Orders");
...
}
}

这似乎可以很好地满足我的大部分需求。

我遇到的问题是,其中一些 View 中包含大量数据,因此当我调用如下内容时:

var customers = _repository.Customers().Where(c => c.Location == location).Where(...);

它似乎正在恢复整个数据集,这可能需要一些时间才能让 LINQ 查询将数据集缩减为我需要的数据集。当条件仅适用于少数记录并且我从 SQL Server 获取整个数据集时,这似乎非常低效。

我试图通过使用存储过程来解决这个问题,例如

public IEnumerable<Customer> CustomersThatMatchACriteria(string criteria1, string criteria2, ...) //or an object passed in!
{
return Database.SqlQuery<Customer>("Exec pp_GetCustomersForCriteria @crit1 = {0}, @crit2 = {1}...", criteria1, criteria2,...);
}

虽然这要快得多,但这里的问题是它不返回 DbSet,因此我失去了对象之间的所有连接,例如我不能引用任何关联的对象,例如订单或联系人,即使我包含它们的 ID,因为返回类型是“客户”的集合而不是它们的 DbSet。

有没有人有更好的方法让 SQL Server 执行查询,这样我就不会传递大量未使用的数据?

最佳答案

var customers = _repository.Customers().Where(c => c.Location == location).Where(...

如果 Customers() 返回 IQueryable,这个语句本身实际上根本不会“带回”任何东西——调用 Where一个 IQueryable 给你另一个 IQueryable,直到你做了一些导致查询执行的事情(比如 ToList,或者 FirstOrDefault) 将实际执行任何操作并返回结果。

但是,如果此 Customers 方法返回实例化对象的集合,那么是的,因为您正在请求所有对象,所以您将获得所有对象。

我从来没有使用过代码优先甚至然后存储库模式,所以我不知道该建议什么,除了尽可能长时间地停留在 IQueryable 的领域,并且仅在应用所有相关过滤器后才执行查询。

关于c# - 使用 Entity Framework 提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596910/

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