Поскольку поставщик LINQ не может преобразовать метод m1 в совместимый оператор SQL.
Вызывая ToList<SomeEntity>()
, вы читаете все это в память, а затем используете LINQ to Objects для фильтрации (и поскольку в этом случае запрос не переводится в SQL, проблем с выполнением запроса не возникает).
К сожалению, нет простого способа заставить первый запрос работать. Если вам действительно нужно использовать m1
для фильтрации результатов, вам сначала нужно будет что-то прочитать в память.
Это не просто ограничение LINQ to nHibernate. Это произойдет в любой ситуации, когда поставщик LINQ использует деревья выражений для преобразования вашего кода в другой язык (в этом случае он пытается преобразовать ваш код C # в операторы SQL, что аналогично тому, как это делают LINQ to SQL и Entity Framework).