NHibernate查询中的非唯一列

时间:2018-10-01 12:35:57

标签: nhibernate

我有以下情况:
在SqlServer数据库中,有两个定义如下的表:

CREATE TABLE [dbo].[T1](
    [c1] [nvarchar](50) NOT NULL,
    [c2] [int] NULL,
CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED ([c1] ASC)) ON [PRIMARY]

CREATE TABLE [dbo].[T2](
    [c1] [nvarchar](50) NOT NULL,
    [c2] [int] NULL,
CONSTRAINT [PK_T2] PRIMARY KEY CLUSTERED ([c1] ASC)) ON [PRIMARY]

我向T1添加一条记录,向T2添加另一条记录,

INSERT INTO [dbo].[T1] ([C1],[C2]) VALUES ('a', 1)
INSERT INTO [dbo].[T2] ([C1],[C2]) VALUES ('a', 2)

然后我执行以下C#代码(其中Session是NHibernate会话):

var data = Session.CreateSQLQuery("SELECT * FROM T1 JOIN T2 ON T1.C1 = T2.C1").List();

在“数据”中,我收到一条包含四列的记录。值如下: “ a”,1,“ a”,1。

如果我在Sql Server Management Studio中手动执行查询,则会得到良好的结果“ a”,“ a”,“ 2”。由于某些原因,NHibernate无法区分具有相同名称或别名的列。

有人知道如何找到一种可行的方法吗?我不能保证使用唯一的别名而不是*,我还需要使用原始查询而不是对象映射。目前,我唯一的解决方法是使用没有NHibernate的旧数据集。我将非常感谢所有建议和帮助:)

1 个答案:

答案 0 :(得分:1)

如果您的表已映射到一个类,而您只想要所有(“ *”)映射的属性,则可以

var data = Session.CreateSQLQuery("SELECT {T1.*},{T2.*} FROM T1 JOIN T2 ON T1.C1 = T2.C1")
   .AddEntity("T1", typeof(TheClass))
   .AddEntity("T2", typeof(TheClass))
   .List();

如果没有,我认为最好的选择是使用“良好的旧数据集”或数据读​​取器,但您可以在ISession上公开它的扩展方法,以使连接管理等透明。