У меня есть приложение, в котором я могу выбрать базу данных с помощью комбинированного списка, а затем применить несколько запросов к этой базе данных в приложении. Для этого я сгенерировал 6 разных .edmx
файлов, которые генерируются из моих баз данных с использованием подхода «база данных в первую очередь». Кроме того, я хочу создать класс Data Access Layer , в котором я управляю своими операциями доступа к данным, но я хочу, чтобы этот класс был универсальным, чтобы мне не нужно было создавать 6 различных классов доступа к данным. для каждой сущности. Для этого я создал такой класс:
public class UserDetails<TEntity> where TEntity:class
{
private DbContext _context { get; set; }
private DbSet<TEntity> efDB { get; set; }
public UserDetails(DbContext context)
{
_context = context;
efDB = _context.Set<TEntity>();
}
public List<UserDetailsModel> GetUserDetails(int? roleID, int? titleID, int? managerID, string id = "", string name = "", string surname = "", string mail = "")
{
using (efDB) {
List<UserDetailsModel> query = (from user in efDB.TABLE_USER
join pass in efDB.TABLE_PASSWORD_HISTORY on GetLatestPassword(user.ID) equals pass.ID into passJoined
from passLatest in passJoined.DefaultIfEmpty()
join role in efDB.TABLE_REL_USER_ROLE on user.ID equals role.UserID into roleJoined
from roleRel in roleJoined.DefaultIfEmpty()
join defRole in efDB.TABLE_DEF_ROLE on roleRel.RoleID equals defRole.ID into defRoleJoined
from defRoleRel in defRoleJoined.DefaultIfEmpty()
join title in efDB.TABLE_USER_TITLES on user.TitleID equals title.ID
where user.Name.Contains(name) && user.Surname.Contains(surname) && user.Email.Contains(mail)
select new UserDetailsModel() {
ID = user.ID,
Name = user.Name,
Surname = user.Surname,
Email = user.Email,
TitleID = (int)user.TitleID,
TitleName = title.Description,
Password = passLatest.Password,
RoleID = roleRel.RoleID,
RoleName = defRoleRel.RoleName,
}
).ToList();
return query;
}
Как видите, я хочу выполнить запрос linq в моем методе GetUserDetails
. Обратите внимание, что все 6 баз данных имеют одинаковые таблицы с одинаковыми именами, поэтому этот запрос будет работать для всех моих сущностей. Что я хочу сделать здесь, так это использовать переменную efDB
в общем, чтобы она могла быть любой из 6 баз данных. Нужный экземпляр объекта базы данных будет создан другим классом, который работает как фабрика и будет передан моему UserDetails
классу доступа к данным. Но, очевидно, мой код не будет работать. Как я могу реализовать эту общую логику в моей системе? Заранее спасибо.