我有以下情况:
在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的旧数据集。我将非常感谢所有建议和帮助:)
答案 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上公开它的扩展方法,以使连接管理等透明。