私は、POCOFirstアプローチでEntityFrameworkを使用しています。私は、スティーブ・サンダーソンが著書「Pro ASP.NET MVC 3 Framework」で説明したパターンに従い、DIコンテナーとDbContextクラスを使用してSQLServerに接続しました。
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サーバーにクエリを実行させるより良い方法はありますか?