c# - 使用 Entity Framework 提高效率

标签 c# .net entity-framework

我一直在使用 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/

相关文章:

c# - 如何在 visual studio 2010 中添加 System.Windows.Forms

c# - S : new() in c# 是什么意思

c# - 如何在 C# 中序列化-反序列化 DigitalPersona u.ere.u 4500 的指纹并保存到数据库

c# - PictureBox - 处理图像非透明区域的点击事件

c# - ASP.NET Entity Framework 6 HashSet 或集合列表?

asp.net - Entity Framework 上下文为静态

c# - 如何编写带有 out 参数的异步方法?

.net - ReSharper 和隐式类型变量

c# - 用圆括号包围 lambda 表达式参数

c# - 使用 Database.SetInitializer 避免霰弹枪手术