将CASE WHEN从SQL转换为NHIBERNATE

时间:2014-12-01 08:04:53

标签: nhibernate queryover

我在下面有一条SQL语句,需要将其转换为NHibrnate QueryOver。我在网上搜索过但找不到具体的解决方案。有人可以帮我这个吗?

SELECT 
  TABEL1.Id, 
  CASE WHEN EXISTS (SELECT Id FROM TABLE2 WHERE TABLE2.ID = TABLE1.ID)
       THEN 'TRUE' 
       ELSE 'FALSE'
  END AS NewFiled  
FROM TABLE1


            --Here is the real POCO

                   public class UserRole 
                    {
                        [Required]
                        public virtual User User { get; set; }

                        [Required]
                        public virtual Role Role { get; set; }

                    }

                    public class UserTenant 
                    {

                        [Required]
                        public virtual Tenant Tenant { get; set; }


                        [Required]
                        public virtual User User { get; set; }

                    }


                    public class Role
                    {

                        public int Id {get;set}         
                        [StringLength(255), Required]
                        public virtual string RoleLabel { get; set; }

                        [StringLength(4000), Required]
                        public virtual string RoleDescription { get; set; }

                    }

                    public class User
                    {

                        public int Id {get;set}         
                        [StringLength(255), Required]
                        public virtual string Firstname { get; set; }

                        [StringLength(255), Required]
                        public virtual string Lastname { get; set; }

                    }


                   public class Tenant
                    {

                        public int Id {get;set}         
                        [StringLength(255), Required]
                        public virtual string Name { get; set; }

                        [StringLength(4000), Required]
                        public virtual string Description { get; set; }

                    }

             public class AssignRoleUsersModel
                {

                    public virtual int UserId { get; set; }

                    public virtual string LastName { get; set; }

                    public virtual string FirstName { get; set; }


                    public virtual bool IsAssigned { get; set; }



                }


    --This is the method to get the users assigned or not for that particular role.
   public RoleUsers GetRoleUsers(int Id)
                    {
             UserRole userRolesAlias = null;
             UserTenant userTenantsAlias = null;



         -- This query will get the role depending the Id that have passed. Take note that I don't want to use this query that is why I am converting it to queryOver.

                    var role = (from r in RoleRepository.Queryable()
                                where r.Id == Id
                                select r).FirstOrDefault();

        --This query will get all the users having the role result above.Take note that I don't want to use this query that is why I am converting it to queryOver.

                    var assignedUsers = UserRoleRepository.Queryable().Where(x => x.Role.Id == role.Id).Select(a => a.User.Id).ToArray();


        --This is the condition to know if the user was assigned to the role

                    var projection = Projections.Conditional(Restrictions.Where(() => userRolesAlias.User.Id.IsIn(assignedUsers))
            , Projections.Constant(true)
            , Projections.Constant(false)
            );

                    var users =
                        new List<AssignRoleUsersModel>(UnitOfWorkLocalData.CurrentUnitOfWork.Session.QueryOver(() => userTenantsAlias)
                                                    .Select(x => x.User.Id)
                                                    .Select(x => x.User.LastName)
                                                    .Select(x => x.User.FirstName)
                                                    .Select(x => x.User.UserName)
                                                    .Select(projection)
                                                    .TransformUsing(Transformers.AliasToBean<AssignRoleUsersModel>())
                                                    .List<AssignRoleUsersModel>());

        }

1 个答案:

答案 0 :(得分:0)

根据扩展问题进行扩展,以及如何做CASE WHEN的方式:

// the ID of searched role, coming as parameter id
int searchedRolId = ...

UserRole userRolesAlias = null;

// this is the SUBQUERY we need, the inner select
var subquery = QueryOver
    .Of<UserRole>(() => userRolesAlias)
    .Where(() => userRolesAlias.Role.Id == searchedRolId)
    .Select(x => userRolesAlias.User.Id);

// here we use NHibernate built in Subqueries tools
var projection = Projections.Conditional(
    Subqueries.Exists(subquery.DetachedCriteria) // this is the SUB-SELECT
    , Projections.Constant(true)
    , Projections.Constant(false)
    );

ORIGINAL - 这可能是这样的:

var projection = Projections.Conditional(
    NHibernate.Criterion.Expression
        .Sql("EXISTS (SELECT Id FROM TABLE2 WHERE TABLE2.ID = {alieas}.ID)")
    , Projections.Constant(true)
    , Projections.Constant(false)
    );
var query = session.QueryOver<Table1>();

ResultDto result = null;
var list = query.SelectList(l => l
    .Select(x => x.ID).WithAlias(() => result.ID)
    .Select(projection).WithAlias(() => result.DoesExist)
    )
    .TransformUsing(Transformers.AliasToBean<ResultDto>())
    .List<ResultDto>();

此处的列表包含ResultDtos集合,如果子标签TABLE2记录存在,则包含ID和决策。 {alias}将被NHibernate替换为outert表的别名......

这是我们投影的DTO:

public class ResultDto
{
    public virtual int ID { get; set; }
    public virtual bool DoesExist { get; set; }
}
相关问题