NHibernate: пользовательский критерий для управления объединениями - PullRequest
1 голос
/ 17 марта 2010

У меня есть странное требование, которое мои клиенты навязали мне. У них есть определенные запросы, которые они потратили много времени на оптимизацию этой работы следующим образом:

  1. Хранимая процедура создает «список идентификаторов», который в основном представляет фильтр «Где»
  2. Идентификационный список объединен с вашими таблицами данных

Идентификационный список будет выглядеть примерно так

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 Ответ

1 голос
/ 17 марта 2010

Лучше всего добавить таблицу «список идентификаторов» в свои сопоставления, чтобы можно было выполнить объединение, как и любую другую таблицу.

Другой вариант - выполнить объединение в предложении 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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...