У меня есть код EF для извлечения некоторых объектов в контроллере, но я хочу отделить свои функции, чтобы улучшить повторное использование кода.Могу ли я передать контекст 'using' другому методу в C#?
Мой код в настоящее время выглядит следующим образом:
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();
}
}
Однако, это приводит к два отдельных подключения к базе данных (насколько я понимаю). Один открывается и закрывается для каждого запроса.
Есть ли способ, чтобы передать контекст методу, что-то вроде этого
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();
}
Есть ли что-то подобное, я могу сделать так, что я могу и выделить свой код, а также использовать минимальное количество возможно ли подключение к базе данных?
первая реализация вызывает также 2 запросов к БД – Nagg
Кажется, вы написали Раствора себя, что не так ли? – SergeyS
Означает ли это два отдельных соединения с базой данных или оба запроса выполняются под тем же соединением в примере 3? (@nagg, вот что я имел в виду - два _connections_, а не запросы) – roryok