如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER

Posted

技术标签:

【中文标题】如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER【英文标题】:how to select multiple columns with only one distinct column from joining two tables with all id's are UNIQUEIDENTIFIER using Nhibernate 【发布时间】:2017-12-08 18:19:02 【问题描述】:

以下是我的表结构:

create table Department(
    deptid [UNIQUEIDENTIFIER] ROWGUIDCOL DEFAULT NEWSEQUENTIALID() NOT NULL CONSTRAINT Department_P_KEY PRIMARY KEY,
    departmentname varchar(100)
    )

create table Employee(
    empid [UNIQUEIDENTIFIER] ROWGUIDCOL DEFAULT NEWSEQUENTIALID() NOT NULL CONSTRAINT Employee_P_KEY PRIMARY KEY,
    name varchar(50), 
    city varchar(50),     
    deptid UNIQUEIDENTIFIER NOT NULL,
    foreign key(deptid) references Department(deptid) ON DELETE CASCADE ON UPDATE CASCADE
    )

我的问题是,当我选择多个列并在所有主键和外键为 UNIQUEIDENTIFIER 的列上应用 DISTINCT 时,该时间查询会给出错误消息。我的查询和错误如下:

select distinct(Department.deptid),min(Employee.empid) as empid
from Employee
inner join Department on Department.deptid = Employee.deptid
group by Department.deptid

错误信息是:

消息 8117,级别 16,状态 1,行 2 操作数数据类型唯一标识符对 min 运算符无效。

但是如果主键和外键是 int 那么上面的查询将成功执行,因为 min 函数支持整数但是我如何使用 uniqueidentifier 键选择不同的记录。

以下是我的 Nhibernate 查询:-

EmployeeEntity employeeEntity = new EmployeeEntity();
            employeeEntity.DepartmentMaster = new DepartmentEntity();
            ProjectionList projectionList = Projections.ProjectionList();
            projectionList.Add(Projections.Distinct(Projections.Property<EmployeeEntity>(x => x.DepartmentMaster)).WithAlias(() => employeeEntity.DepartmentMaster));
            projectionList.Add(Projections.Property<EmployeeEntity>(x => x.empid).WithAlias(() => employeeEntity.empid));

            IList<EmployeeEntity> query = null;
            query = NHSession.QueryOver<EmployeeEntity>()
            .Select(projectionList)
            .TransformUsing(Transformers.AliasToBean<EmployeeEntity>()).List<EmployeeEntity>();

如何按照上面的sql查询先在sql中执行不同的查询?

【问题讨论】:

【参考方案1】:

只需将 UniqueIdentifier 转换为字符串

select distinct(Department.deptid),min(CAST(Employee.empid AS NVARCHAR(36))) as empid
from Employee
inner join Department on Department.deptid = Employee.deptid
group by Department.deptid

【讨论】:

以上是关于如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NHibernate 检索具有列表条件的元素

如何使用 DISTINCT 在 NHibernate SQL 查询中进行分页

您如何在流利的 nhibernate 中映射和使用连接表?

Fluent NHibernate:如何在关系表上映射具有附加属性的多对多关系?

Fluent Nhibernate 映射多重连接

使用 nhibernate 跨数据库连接