NHibernate:自定义标准来操纵连接

时间:2010-03-17 18:45:19

标签: .net nhibernate

我有一个奇怪的要求,我的客户强加给我。他们有一些查询,他们花了很多时间来优化这项工作,如下所示:

  1. 存储过程会建立一个“id-list”,它基本上代表“Where”过滤器
  2. id-list已加入数据表
  3. 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并阅读文档注释,我只是不确定我将在哪里挂钩查询构建过程。

1 个答案:

答案 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>();