Gra*_*Roy 5 .net c# entity-framework
我一直在使用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");
...
}
}
Run Code Online (Sandbox Code Playgroud)
这对我的大部分需求似乎都很好.
我遇到的问题是,其中一些视图中包含大量数据,因此当我调用类似的内容时:
var customers = _repository.Customers().Where(c => c.Location == location).Where(...);
Run Code Online (Sandbox Code Playgroud)
它似乎带回了整个数据集,在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,...);
}
Run Code Online (Sandbox Code Playgroud)
虽然这要快得多,但问题在于它没有返回DbSet,因此我失去了对象之间的所有连接,例如,即使我包含了ID,我也无法引用任何相关对象,如订单或联系人因为返回类型是'Customers'的集合,而不是它们的DbSet.
有没有人有更好的方法让SQL服务器进行查询,这样我就不会传递大量未使用的数据?
Run Code Online (Sandbox Code Playgroud)var customers = _repository.Customers().Where(c => c.Location == location).Where(...
如果Customers()return IQueryable,这个语句实际上根本不会“带回”任何东西 - 调用WhereanIQueryable会给你另一个IQueryable,直到你做了一些导致查询执行的事情(例如ToList, or FirstOrDefault),任何东西才会真正被执行,并且结果返回。
但是,如果此Customers方法返回实例化对象的集合,那么是的,因为您正在请求所有对象,所以您将获得所有对象。
IQueryable我从未使用过代码优先或什至存储库模式,所以我不知道该建议什么,除了尽可能长时间地停留在领域中,并且仅在应用了所有内容后才执行查询相关过滤器。
| 归档时间: |
|
| 查看次数: |
1113 次 |
| 最近记录: |