Это действительно зависит от того, насколько динамичным будет запрос, но чтобы дать вам представление, следующее довольно просто и может быть расширено для удовлетворения гораздо более сложных требований:
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
.
Мы используем что-то подобное для построения запросов на основе критериев динамического поиска, включая диапазоны дат, подзапросы и пейджинг.