在 C# 中动态设置查询类型
Set query type dynamically in C#
我需要你的帮助。我想根据用户角色实现不同类型的数据库请求。
我当前的查询如下所示:
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
应在 .Query<T>
中动态更改 TypeB
。
请问有什么好的方法吗?你需要更多的信息?
提前致谢:-)
编辑:
场景如下所示:
我必须根据用户角色从数据库中获取不同的模型。假设用户是 Admin 他可以看到 firstname, lastname, address
,否则他只能看到 firstname, lastname
.
我想用这些属性创建两个不同的模型并动态更改查询中的类型。
你需要先了解分层的概念。
所以首先你会有一个 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 端,我将 return 一个 DTO(数据传输对象),这对于两种情况都是相同的!:
public class UserDTO
{
public int UserId { get;set;}
public string FirstName { get;set;}
public string LastName { get;set;}
public string Address { get;set;}
}
现在最后一部分是controller,在这里你会从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
我需要你的帮助。我想根据用户角色实现不同类型的数据库请求。
我当前的查询如下所示:
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
应在 .Query<T>
中动态更改 TypeB
。
请问有什么好的方法吗?你需要更多的信息?
提前致谢:-)
编辑:
场景如下所示:
我必须根据用户角色从数据库中获取不同的模型。假设用户是 Admin 他可以看到 firstname, lastname, address
,否则他只能看到 firstname, lastname
.
我想用这些属性创建两个不同的模型并动态更改查询中的类型。
你需要先了解分层的概念。
所以首先你会有一个 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 端,我将 return 一个 DTO(数据传输对象),这对于两种情况都是相同的!:
public class UserDTO
{
public int UserId { get;set;}
public string FirstName { get;set;}
public string LastName { get;set;}
public string Address { get;set;}
}
现在最后一部分是controller,在这里你会从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