IronPython с Linq генерирует исключение ArgumentTypeException

Я пытаюсь расширить свое веб-приложение с помощью IronPython, которое до сих пор прекрасно работает, но я не могу заставить его хорошо работать с моей настройкой NHibernateLinq.

Я делаю IQueryable‹Case› доступным для кода IronPython, а затем использую методы Linq для его фильтрации, например:

Enumerable.Where[object](data, Func[object, bool](func))

Это работает нормально, но поскольку я использую Enumerable вместо Queryable, он извлекает ВСЕ записи из базы данных перед запуском Where. на них, когда я хочу, чтобы предложение Where было добавлено в SQL-запрос, сгенерированный NHibernate.

Итак, я попытался:

Queryable.Where[object](data, Func[object, bool](func))

Но это просто дает:

Microsoft.Scripting.ArgumentTypeException: expected IQueryable[object], got Query[Case] 

Я что-то упускаю? Это вообще возможно?

Энтони


person littlecharva    schedule 23.07.2009    source источник


Ответы (1)


Общая инвариантность, в основном, вызывает у вас проблемы. Func<object, bool> нельзя преобразовать в Func<Case,bool> — по крайней мере, до .NET 4.0.

Обратите внимание, что для Queryable.Where потребуется дерево выражений, а не делегат. Поддерживает ли IronPython деревья выражений?

Если вы можете создать дерево выражений в Python, можете ли вы сделать его Expression<Func<Case,bool>> вместо Expression<Func<Object,bool>>? Если вы можете, это должно заставить его работать.

person Jon Skeet    schedule 23.07.2009
comment
Я немного задумался об этом. Не могу найти никаких доказательств того, что IronPython поддерживает деревья выражений, поэтому я переключился на использование HQL вместо Linq. Ваше здоровье. - person littlecharva; 23.07.2009