如何使用NHibernate对象编写此选择?
Select a.Id, a.Name, b.Data
From Table1 a, Table2 b
Where a.Id between :1 and :2
And :3 = b.Period(+)
And 1 = b.Type(+)
And a.Id = b.Table1Id(+)
Order by 1
即。它为每一行提供Table2.Data的所有Table1行,即使它没有Table2数据(然后会给出0或null)
Table1和Table2的类和映射已经创建并且有效。 b.Table1Id的参考也加入了。
所以问题主要在(+)运算符中。
映射: Table1非常简单,不会引用任何表。 表2:
Table("Table2");
CompositeId()
.KeyProperty(x => x.Type)
.KeyProperty(x => x.Table1Id)
.KeyProperty(x => x.Period);
Map(x => x.Type);
Map(x => x.Table1Id);
Map(x => x.Period);
Map(x => x.Data);
ReferencesAny(x => x.TableG)
.IdentityType<string>()
.EntityTypeColumn("Type")
.EntityIdentifierColumn("Table1Id")
.AddMetaValue<Table1>("1")
.AddMetaValue<Table33>("33");
Table1和Table33来自一个父类TableG的ingerites。现在更新了Sql查询。
答案 0 :(得分:1)
你可以做这样的事情来获取记录。并使用投影选择所需的字段。 有一个类似的示例here可以帮助您入门。
var queryResult = Session.QueryOver<Table2>()
.Left.JoinAlias(table2 => x.Period, () => period)
.Where(table2 => table2.Id >= value1)
.Where(table2 => table2.Id <= value2)
.Where(table2 => table2.Type == 1)
.OrderBy(table2 => table2.Type).List<Table2>();