Sql Fluent NHibernate:如何将此查询作为条件编写?
数据结构如下: 房子有许多房间。每个房间都有很多人 我想做的是让所有人都买房子。在纯SQL中,我将编写以下内容:Sql Fluent NHibernate:如何将此查询作为条件编写?,sql,fluent-nhibernate,Sql,Fluent Nhibernate,数据结构如下: 房子有许多房间。每个房间都有很多人 我想做的是让所有人都买房子。在纯SQL中,我将编写以下内容: SELECT * FROM Person WHERE Room_id IN (SELECT Id FROM Room WHERE House_id = 1) 我怎样才能用流利的NHibernate'ish代码来写呢 对于本例,我们可以假设实体和映射如下所示: SELECT this_.Id as Id4_0_, this_.Name as Name4_0_, this_.RoomI
SELECT * FROM Person WHERE Room_id
IN
(SELECT Id FROM Room WHERE House_id = 1)
我怎样才能用流利的NHibernate'ish代码来写呢
对于本例,我们可以假设实体和映射如下所示:
SELECT this_.Id as Id4_0_, this_.Name as Name4_0_, this_.RoomId as RoomId4_0_
FROM [Person] this_
WHERE this_.RoomId in (SELECT this_0_.Id as y0_ FROM [Room] this_0_ WHERE this_0_.HouseId = @p0)',N'@p0 int',@p0=1
众议院实体
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IEnumerable<Room> Rooms { get; set; }
房间实体
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual House House { get; set; }
public virtual IEnumerable<Person> Persons { get; set; }
个人实体
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Room Room { get; set; }
人员映射
Id(x => x.Id);
Map(x => x.Name);
References(x => x.Room);
要使SQL查询接近您的查询,可以使用以下标准:
var subCriteria = DetachedCriteria.For<Room>(); // subquery
subCriteria.Add(Expression.Eq("House", house)); // where clause in subquery
subCriteria.SetProjection(Projections.Id()); // DetachedCriteria needs to have a projection, id of Room is projected here
var criteria = session.CreateCriteria<Person>();
criteria.Add(Subqueries.PropertyIn("Room", subCriteria)); // in operator to search in detached criteria
var result = criteria.List<Person>();
我在FNH1.2和NH3.1中对其进行了测试,但它在NH2.1中也应该运行良好
编辑:
UpTheCreek是对的。Linq比标准API更清晰。例如:
var query = session.Query<Person>().Where(x => x.Room.House == house);
var linqResult = query.ToList<Person>();
这不是一个流畅的问题-fluent仅用于指定映射和配置。根据您使用的NHibernate版本,您可以选择HQL、Criteria API或(如果是NH3)Linq。请显示您的实体和映射?@Jakub:Done@UptheCraek:哪种解决方案看起来最漂亮?你能给我举个例子吗?@Awesome-你用的是哪个版本的NHibernate?Linq是目前为止最清晰的方法。@Awesome-那么当你有一个需要编写的标准查询时,我个人会选择Linq,而不关心SQL的具体外观。Jakub下面的ICriteria答案很好,我很高兴它能帮上忙。但UpTheCreek是对的。Linq比我个人讨厌的API更清晰:)。另一方面,由于历史原因,我对NH Linq持谨慎态度——NH2.1中的Linq实现不是很有用。但你自己来判断(编辑后)。
SELECT this_.Id as Id4_0_, this_.Name as Name4_0_, this_.RoomId as RoomId4_0_
FROM [Person] this_
WHERE this_.RoomId in (SELECT this_0_.Id as y0_ FROM [Room] this_0_ WHERE this_0_.HouseId = @p0)',N'@p0 int',@p0=1
var query = session.Query<Person>().Where(x => x.Room.House == house);
var linqResult = query.ToList<Person>();
select person0_.Id as Id4_, person0_.Name as Name4_, person0_.Room_id as Room3_4_
from [Person] person0_, [Room] room1_
where person0_.Room_id=room1_.Id and room1_.House_id=2