2012-04-01 4 views
2

Я мог бы использовать некоторую помощь при преобразовании выражений.Преобразование из выражения <Func <TypeIn, TypeOut1 >> в выражение <Func <TypeIn, TypeOut2 >>

У меня есть метод на класс, который выглядит следующим:

protected IQueryOver<TEntity, TEntity> OrderQuery<TOrderBy>(
    Expression<Func<TEntity, TOrderBy>> orderBy) 
    { 
     return session.QueryOver<TEntity>().OrderBy(orderBy).Asc; 
    } 

Это общий запрос для хранилища класса. Я хочу сохранить общие данные, поэтому я задал параметр TOrderBy, чтобы тип свойства не имел значения. Тем не менее, этот пример реализации с использованием NHibernate, и я пытаюсь сделать следующее:

var query = session.QueryOver<TEntity>().OrderBy(orderBy).Asc; 

Однако Ther метод OrderBy принимает параметр Expression> и поэтому я получаю ошибку компиляции, поскольку нет никакой гарантии, что TOrderBy будет объектом.

Есть ли способ сделать это преобразование или я должен просто придерживаться использования объекта, а не TOrderBy? Если я придерживаюсь объекта, не теряю ли я способность заказывать ValueTypes (например, DateTime)?

Спасибо за любую помощь/предложения.

EDIT: Я должен упомянуть, что я сохранил этот общий код, поскольку буду писать реализации для nhibernate и сущности. В EF нет проблемы с этим, поскольку он использует обычный метод Linq OrderBy. Это просто в реализации Nhibernate. У меня эта проблема.

+0

Возможно, я ошибаюсь, но если есть ошибка с TOrderBy, вы можете попробовать добавить ограничения типа «где TOrderBy: class» –

+0

Я не хочу добавлять ограничение класса, так как вы не сможете использовать вещи например DateTime или int или другие типы значений –

+0

Можете ли вы использовать typeof (TOrderBy) для запуска альтернативной логики для ссылочных типов значений? – Rich

ответ

0

Если вы используете LINQ с EF, почему бы не использовать LINQ с NHibernate, а не QueryOver?

+0

Да, кто-то указал мне, что с NH 3 Linq2NH был добавлен к нему, поэтому я переключился на это для этого конкретного сценария –

Смежные вопросы