我有一个奇怪的要求,我的客户强加给我。他们有一些查询,他们花了很多时间来优化这项工作,如下所示:
id-list看起来像这样
IdListTable.Customers_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还是完全是为了其他东西?
其次,我该怎么做呢。我已经尝试过实现AbstractCriterion并阅读文档注释,我只是不确定我将在哪里挂钩查询构建过程。
答案 0 :(得分:1)
最好的办法是将“id-list”表添加到映射中,这样就可以像任何其他表一样执行连接。
另一个选择是在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>();