我一直在使用带有 POCO First 方法的实体框架。我几乎遵循了 Steve Sanderson 在他的“Pro ASP.NET MVC 3 Framework”一书中描述的模式,使用 DI 容器和 DbContext 类连接到 SQL Server。
SQL Server 中的基础表包含不同应用程序使用的非常大的数据集。因此,我不得不为我的应用程序中需要的实体创建视图:
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");
...
}
}
这似乎可以满足我的大部分需求。
我遇到的问题是,其中一些视图中有大量数据,因此当我调用类似以下内容时:
var customers = _repository.Customers().Where(c => c.Location == location).Where(...);
它似乎正在带回整个数据集,这可能需要一些时间才能使 LINQ 查询将数据集减少到我需要的数据集。当标准仅适用于少数记录并且我从 SQL 服务器获取整个数据集时,这似乎非常低效。
我试图通过使用存储过程来解决这个问题,例如
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 进行查询,这样我就不会传递大量未使用的数据?