我需要你的帮助。我想根据用户角色实现具有不同类型的数据库请求。
我当前的查询如下:
var myVar = session
.Query<TypeA>()
.Where(xyz)
.ToList();
现在我想这样做:
if(UserIsAdmin)
Type T = TypeA;
else
Type T = TypeB;
var myVar= session
.Query<T>()
.Where(xyz)
.ToList();
注意TypeA
和TypeB
应该在.Query<T>
中动态更改。
有什么好办法吗?你需要更多的信息?
预先感谢:-)
编辑:
该方案如下:
我必须根据用户角色从数据库中获取不同的模型。假设用户是管理员,他可以看到firstname, lastname, address
,否则他只能看到firstname, lastname
。
我想用这些属性创建两个不同的模型,并动态更改查询中的类型。
答案 0 :(得分:-1)
您需要首先了解分离层的概念。
因此,首先,您将拥有一个DB layer
,在您的情况下(尽管我不知道您的数据库模式),但它看起来应该像这样:
public class UsersDbServices
{
public UserDbEntity GetUserById(int userId)
{
UserDbEntity user = null
using (context..)
{
user = context.Users.Where(u=> u.Id = userId).FirstOfDefault();
}
return user;
}
}
您将从Logic
层调用此服务,请注意,normal
用户和administrator
都可以使用相同的方法!
现在对于clinet端,我将返回一个DTO(数据传输对象),这两种情况都相同!:
public class UserDTO
{
public int UserId { get;set;}
public string FirstName { get;set;}
public string LastName { get;set;}
public string Address { get;set;}
}
现在最后一部分是控制器,在这里您将从DBLayer
获取数据(您可以通过另一层逻辑,但是可以说不是必须的),现在您将要做的是控制器,您可以通过以下方式填充DTO
(同样,您也可以在逻辑层中完成所有操作):
public class UsersController
{
UsersDbServices m_UsersDbServices = new UsersDbServices ();
[HttpGet]
public UserDTO GetUserById(userId)
{
UserDTO retVal = null;
UserDbEntity userDbEntity = m_UsersDbServices.GetUserById(userId);
if(userDbEntity == null){
throw...
}
retVal = new UserDTO()
{
FirstName = userDbEntity.FirstName;
...
};
if(!UserIsAdmin) <- kept it as a bool here
{
retVal.Address = null;
}
return retVal; <- convert to json
}
}
另一种方法是使用另一个DTO,例如AdminUserDTO
和RegularUserDTO