.net NHibernate从多个表中选择

.net NHibernate从多个表中选择,.net,sql,nhibernate,fluent-nhibernate,.net,Sql,Nhibernate,Fluent Nhibernate,如何使用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 也就是说,它给出了所有表1行和表2。每行的数据,即使没有表2数据(那么将给出0或null) 表1和表2的类和映射已经创建,并且可以正常工作。

如何使用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
也就是说,它给出了所有表1行和表2。每行的数据,即使没有表2数据(那么将给出0或null)

表1和表2的类和映射已经创建,并且可以正常工作。还增加了b.Table1Id的参考

所以问题主要出在(+)算子上

映射: 表1非常简单,没有引用任何表。 表2:

表(“表2”);
复合ID()
.KeyProperty(x=>x.Type)
.KeyProperty(x=>x.Table1Id)
.KeyProperty(x=>x.Period);
Map(x=>x.Type);
图(x=>x.Table1Id);
Map(x=>x.Period);
Map(x=>x.Data);
引用任意(x=>x.TableG)
.IdentityType()
.EntityTypeColumn(“类型”)
.EntityIdentifierColumn(“表1ID”)
.AddMetaValue(“1”)
.AddMetaValue(“33”);

表1和表33来自一个父类的ingerites表G。Sql查询现在相应地更新了。

您可以这样做来获取记录。并使用投影选择所需的字段。 有一个类似的例子可以帮助您开始

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>();
var queryResult=Session.QueryOver()
.Left.JoinAlias(表2=>x.Period,()=>Period)
.Where(table2=>table2.Id>=value1)
.Where(table2=>table2.Id table2.Type==1)
.OrderBy(table2=>table2.Type).List();

您也可以显示映射吗?您试图让这个查询在nhibernate中运行什么?添加了映射。我根本没有试过这么做,我不知道从什么开始。
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>();