在C#中动态设置查询类型

时间:2018-06-22 08:34:03

标签: c# sql linq nhibernate

我需要你的帮助。我想根据用户角色实现具有不同类型的数据库请求。

我当前的查询如下:

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();

注意TypeATypeB应该在.Query<T>中动态更改。

有什么好办法吗?你需要更多的信息?

预先感谢:-)

编辑:

该方案如下:

我必须根据用户角色从数据库中获取不同的模型。假设用户是管理员,他可以看到firstname, lastname, address,否则他只能看到firstname, lastname

我想用这些属性创建两个不同的模型,并动态更改查询中的类型。

1 个答案:

答案 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,例如AdminUserDTORegularUserDTO