コントローラー内のいくつかのオブジェクトを取得するための EF コードがいくつかありますが、関数を分割してコードの再利用を改善したいと考えています。
私のコードは現在、次のようになっています。
public ActionResult SentMessages(){
MyModel model = new MyModel();
int user_id = GetCurrentUserId();
using(DataContext db = new DataContext()){
model.Messages =
db.Messages
.Where(x => x.sent == true)
.Where(x => x.user_id == user_id)
.Where(x => x.date_deleted == null)
.OrderBy(x => x.date_sent)
.Take(10)
.ToList();
model.Groups = db.Groups
.Where(x => x.user_id == user_id)
.Where(x => x.date_deleted == null)
.OrderBy(x => x.date_created)
.ToList();
}
return model;
}
私はそれを再利用可能なコードチャンクに分割したい(そしてコントローラーを小さくしたい)
public ActionResult SentMessages(){
MyModel model = new MyModel();
int user_id = GetCurrentUserId();
model.Messages = GetLastTenMessages(user_id);
model.Groups = GetGroups(user_id);
return model;
}
public static List<Message> GetLastTenMessages(int user_id){
using(DataContext db = new DataContext()){
return db.Messages
.Where(x => x.sent == true)
.Where(x => x.user_id == user_id)
.Where(x => x.date_deleted == null)
.OrderBy(x => x.date_sent)
.Take(10)
.ToList();
}
}
public static List<Group> GetGroups(int user_id){
using(DataContext db = new DataContext()){
return db.Groups
.Where(x => x.user_id == user_id)
.Where(x => x.date_deleted == null)
.OrderBy(x => x.date_created)
.ToList();
}
}
ただし、これにより、データベースへの2つの別々の接続が発生します(私が理解している限り)。クエリごとに 1 つが開かれ、閉じられます。
このようなコンテキストをメソッドに渡す方法はありますか
public ActionResult SentMessages(){
MyModel model = new MyModel();
int user_id = GetCurrentUserId();
using(DataContext db = new DataContext()){
model.Messages = GetLastTenMessages(user_id, db);
model.Groups = GetGroups(user_id, db);
}
return model;
}
public static List<Message> GetLastTenMessages(int user_id, DataContext db){
return db.Messages
.Where(x => x.sent == true)
.Where(x => x.user_id == user_id)
.Where(x => x.date_deleted == null)
.OrderBy(x => x.date_sent)
.Take(10)
.ToList();
}
public static List<Group> GetGroups(int user_id, DataContext db){
return db.Groups
.Where(x => x.user_id == user_id)
.Where(x => x.date_deleted == null)
.OrderBy(x => x.date_created)
.ToList();
}
コードを分離し、可能な限り最小限の数のデータベース接続を使用できるようにするために、このようなことはできますか?