Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Fluent NHibernate:如何将此查询作为条件编写?_Sql_Fluent Nhibernate - Fatal编程技术网

Sql Fluent NHibernate:如何将此查询作为条件编写?

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

数据结构如下: 房子有许多房间。每个房间都有很多人

我想做的是让所有人都买房子。在纯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_.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