Изучите использование JoinAlias вместо JoinQueryOver ... это должно вам помочь.
Существует два вида объединений: прямые объединения на объекте типа T и косвенные объединения (два или более шагов в). Это требует разных подходов.
(1) Для прямых объединений ваш метод может получить IEnumerable типа (готовый к этому):
Tuple<Expression<Func<T, object>>, Expression<Func<object>>>
пример которого может выглядеть следующим образом в коде вызова:
JoiningEntity joiningEntity = null;
new Tuple<Expression<Func<YourEntityType, object>>, Expression<Func<object>>>(entity => entity.JoiningEntity, () => joiningEntity)
Нулевой объект - это просто псевдоним, чтобы QueryOver мог разрешить его. Вы можете раздражаться из-за предупреждений в Visual Studio о том, что оно пустое, поэтому я бы использовал вспомогательный метод для создания пустых объектов, например, Null.Get<HolidayOccupancyPrice>()
(см. Нижнюю часть для вспомогательного метода Null).
(2) Для косвенных объединений необходимо передать IEnumerable типа:
Tuple<Expression<Func<object>>, Expression<Func<object>>>
т.е. как указано выше, но без типа сущности. И тогда ваш телефонный код может отправить соединение следующим образом:
JoiningEntity joiningEntity = null;
new Tuple<Expression<Func<object>>, Expression<Func<object>>>(() => joiningEntity.IndirectJoiningEntity, () => joiningEntity)
Сложив это в свой метод запроса, вы захотите что-то вроде этого:
IEnumerable<Tuple<Expression<Func<T, object>>, Expression<Func<object>>>> directJoins;
IEnumerable<Tuple<Expression<Func<object>>, Expression<Func<object>>>> indirectJoins;
// ....
foreach (var join in directJoins)
query = queryable.Left.JoinAlias(dependency.Item1, dependency.Item2);
foreach (var join in indirectJoins)
query = queryable.Left.JoinAlias(dependency.Item1, dependency.Item2);
(обратите внимание, что я явно указал левое соединение - если вы хотите этот элемент управления, вам нужно добавить его в качестве дополнительного параметра в кортеже)
Теперь все, что выглядит довольно сложным, но довольно просто, если вы соберете его вместе. Конечно, вы можете создавать вспомогательные методы, чтобы уменьшить количество ненужных «Func» в вашем коде.
Надеюсь, это поможет!
Нулевой вспомогательный метод:
public static class Null
{
public static T Get<T>()
{
return default(T);
}
}