Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
.net NHibernate:操作联接的自定义条件_.net_Nhibernate - Fatal编程技术网

.net NHibernate:操作联接的自定义条件

.net NHibernate:操作联接的自定义条件,.net,nhibernate,.net,Nhibernate,我的客户对我提出了一个奇怪的要求。他们有一些查询,他们花了大量时间优化这些查询,如下所示: 存储过程建立一个id列表,它基本上表示Where过滤器 id列表已加入到数据表中 id列表应该是这样的 IdListTable.Customers\u Id 1087, 10094, 87, 1077 因此,联接查询如下所示: SELECT c.Id, c.FirstName, c.LastName FROM Customers c INNER JOIN IdListTable idList ON (c

我的客户对我提出了一个奇怪的要求。他们有一些查询,他们花了大量时间优化这些查询,如下所示:

存储过程建立一个id列表,它基本上表示Where过滤器 id列表已加入到数据表中 id列表应该是这样的

IdListTable.Customers\u Id

1087,
10094,
87,
1077
因此,联接查询如下所示:

SELECT c.Id, c.FirstName, c.LastName
FROM Customers c INNER JOIN IdListTable idList ON (c.Id = idList.Customers_Id);
我希望能在NHibernate做这样的事情

IEnumerable<Customer> GetMatching(Specification spec) {
  string idListName = "IdListTable";

  _idListGenerator.BuildIdList(idListName);

  return _session.CreateCriteria<Customer>().
    Add(new JoinIdListCriterion(idListName)
    .Enumerable<Customer>()
}
那么首先,这是正确的概念吗?我是想实现我自己的ICriterion,还是为了别的什么


第二,我实际上如何做到这一点。我尝试过实现AbstractCriteria并阅读文档注释,但我不确定我将在何处连接到查询构建过程。

最好的办法是将id列表表添加到映射中,这样您就可以像其他表一样执行连接

另一个选项是对WHERE子句执行联接,因此您将得到如下结果:

SELECT c.Id, c.FirstName, c.LastName
FROM Customers c WHERE c.Id IN (SELECT Customers_Id FROM IdListTable);
您可以使用SqlCriteria使其工作:

return _session.CreateCriteria<Customer>("c")
  .Add(Expression.Sql("c.Id IN (SELECT Customers_Id FROM IdListTable)", new object[0], new IType[0]))
  .Enumerable<Customer>();

最好是将id列表表添加到映射中,这样就可以像其他表一样执行连接

另一个选项是对WHERE子句执行联接,因此您将得到如下结果:

SELECT c.Id, c.FirstName, c.LastName
FROM Customers c WHERE c.Id IN (SELECT Customers_Id FROM IdListTable);
您可以使用SqlCriteria使其工作:

return _session.CreateCriteria<Customer>("c")
  .Add(Expression.Sql("c.Id IN (SELECT Customers_Id FROM IdListTable)", new object[0], new IType[0]))
  .Enumerable<Customer>();

谢谢,但我不想映射id列表,因为它不是一个实体。IN查询是实现这一点的一种方法,当然,但我真的很想让它作为一个连接来工作。ICriterion似乎公开了这方面的钩子,但我不确定如何。嘿,Fabio,这将如何与缓存、事务等一起工作。NHibernate似乎无法在这些方面做任何事情,并且您将从一开始就失去使用它的许多好处。缓存和事务应该仍然可以正常工作,我在一些项目中经常使用Expression.Sql,从来没有遇到过任何问题。至于连接,只要您使用criteria API,就必须映射所有表,这就是为什么您可能应该映射IdListTable,即使它不是实体,它仍然是模型的重要部分,或者尝试使用IN子句或某些用户定义函数劫持查询。另一个选项是使用_session.CreateSQLQuery.Thank使用纯SQL编写此特定查询,但我不想映射id列表,因为它不是实体。IN查询是实现这一点的一种方法,当然,但我真的很想让它作为一个连接来工作。ICriterion似乎公开了这方面的钩子,但我不确定如何。嘿,Fabio,这将如何与缓存、事务等一起工作。NHibernate似乎无法在这些方面做任何事情,并且您将从一开始就失去使用它的许多好处。缓存和事务应该仍然可以正常工作,我在一些项目中经常使用Expression.Sql,从来没有遇到过任何问题。至于连接,只要您使用criteria API,就必须映射所有表,这就是为什么您可能应该映射IdListTable,即使它不是实体,它仍然是模型的重要部分,或者尝试使用IN子句或某些用户定义函数劫持查询。另一个选项是使用_session.CreateSQLQuery使用纯SQL编写此特定查询。