在 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,如 AdminUserDTORegularUserDTO