Построение действительно динамических запросов - PullRequest
0 голосов
/ 06 мая 2019

У меня есть запрос на основе простого SQL, и я хочу перевести его в одно или несколько выражений nHibernate.Выражение SQl выглядит следующим образом:

string SQL = "SELECT DISTINCT id FROM basetable ";
List<string> conditions...
if( expression_1 ) {
  SQL += "JOIN table_1 ON ...";
  SqlParameters.Add("fooId", _fooId);
}
...
if( expression_n ) {
  SQL += "JOIN table1 ON ...";
  SqlParameters.Add("barId", _barId);
  conditions.Add("field = @barId");
}
...
SQL += "WHERE " + string.Join(" AND ", conditions.ToArray());

Результатом будет огромное выражение SQL.Есть ли возможность перевести этот вид кода в выражение nHibernate?Спектакль в этом случае не имеет смысла.

1 Ответ

1 голос
/ 07 мая 2019

Это действительно зависит от того, насколько динамичным будет запрос, но чтобы дать вам представление, следующее довольно просто и может быть расширено для удовлетворения гораздо более сложных требований:

EntityA aAlias = null;
EntityB bAlias = null;
// Build the base query, joining all the tables that you may need
var query = session.QueryOver<EntityA>(() => aAlias)
    .JoinAlias(() => aAlias.ListOfB, () => bAlias);

// Add conditions depending on your requirements, e.g. filter criteria passed from an external source
if (expression1) 
{
    query = query.Where(aAlias.SomeId == someId);
}
if (expression2) 
{
    query = query.WhereRestrictionOn(() => bAlias.SomeOtherId).IsIn(listOfIds)
}
// and so on...
// at the end, just execute the query to get a list of strings or whatever you want
var result = query
    .Select(x => aAlias.Id)
    .List<string>();

В зависимости отВ вашем сценарии вы можете поместить конструкцию базового запроса (т. е. связанных таблиц) в производные классы, а код для общих критериев - в базовый класс.Вам просто нужно помнить, чтобы при передаче запроса в качестве параметра другим методам использовать те же имена переменных для Aliases.

Мы используем что-то подобное для построения запросов на основе критериев динамического поиска, включая диапазоны дат, подзапросы и пейджинг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...