Прежде всего, я не уверен, почему вы просто не возвращаете IQueryable и позволяете пользователю метода определить, хотят ли они его в виде списка и т. Д. Поскольку IQueryables не выполняются до тех пор, пока они не потребуются, вы можете продолжать добавлять вдерево выражений до тех пор, пока оно вам действительно не понадобится.
В этом случае, когда вы изменяете его на список объектов, то есть когда запрос фактически выполняется для базы данных, когда он превращается в список.
Если вы действительно хотите сохранить интерфейс как IList вместо IQueryable, просто добавьте дополнительное выражение в дерево выражений перед компиляцией.
Поскольку у меня была ограниченная работа с корневым уровнемдеревья выражений, я бы, скорее всего, неправильно описал синтаксис, поэтому приведу другой пример, который может дать вам достаточно информации о том, о чем я говорю:
var query = something.Where( n => n.FirstName.StartsWith("N")) ;
query = query.Where(n => n.created_at > DateTime.Now);
return query.ToList();
Надеюсь, это имеет смысл.Вы можете просто продолжать добавлять критерии в дерево выражений до тех пор, пока оно не будет скомпилировано и выполнено.
Я все же рекомендовал бы вместо этого передавать arround IQueryable.В моем примере вы просто вернули бы запрос вместо вызова ToList.Это упрощает свободный синтаксис и будет работать лучше с nHibernate, потому что nHibernate будет пытаться учесть все критерии перед вызовом базы данных.Например, если вам нужен только аггрегат или счетчик, он будет обрабатываться в базе данных, а не вытягивать все строки в список, а затем выполнять итерацию по нему, чтобы получить агрегат или счет.