【发布时间】:2019-10-13 08:55:03
【问题描述】:
我有一个应用程序,我可以在组合框的帮助下选择一个数据库,然后在应用程序中对该数据库应用几个查询操作。为此,我生成了 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;
}
如您所见,我想在 GetUserDetails 方法中执行 linq 查询。请注意,所有 6 个数据库都有相同名称的相同表,因此此查询将适用于我的所有实体。我想在这里做的是,使用变量efDBgenericly 以便它可以是 6 个数据库实体中的任何一个。所需的数据库实体实例将由一个像工厂一样工作的不同类创建,并将提供给我的UserDetails 数据访问类。但显然,我的代码不起作用。我怎样才能在我的系统中实现这个通用逻辑?提前致谢。
【问题讨论】:
-
But obvisiouly, my code won't work: 为什么它不起作用?你得到什么错误?
标签: c# asp.net-mvc entity-framework