Используя членское лямбда-выражение доступа для параметризации LINQ к предикату SQL

У меня есть запрос, который должен быть снова использован повсеместно, и я должен варьироваться, какое свойство/столбец привыкает для соединения.

То, что я хотел бы смочь сделать, является чем-то как:

query = RestrictByProp(query, x=>x.ID);

Чрезвычайно упрощенный RestrictByProp() мог be*:

private static IQueryable<Role> RestrictByProp(IQueryable<Role> query, 
                                               Func<Role, int> selector)
{
    return query.Where(x => selector(x) == 1);
}

Проблема состоит в том, что даже эта простая реализация вызывает исключение на этапе выполнения:

Method 'System.Object DynamicInvoke(System.Object[])' has no 
supported translation to SQL.

** (Здесь я просто добавляю простое, 'где' пункт - в моем реальном коде я использовал бы лямбду для выбора который свойство использовать для соединения).*

Я нахожу это странным, потому что, если членская лямбда доступа сделана встроенная, она прекрасна:

 private static IQueryable<Role> RestrictByID(IQueryable<Role> query)
 {
     return query.Where(x=> x.ID == 1);
 }

LINQ к SQL также счастлив, если Вы передаете в Expression<Func<Role, bool>> (т.е. когда параметр x=>x.ID == 1) но это побеждает объект, потому что мне нужно значение правого операнда, который будет определен в запросе.

Есть ли путь к так или иначе munge лямбда-выражение в RestrictByProp() так, чтобы LINQ к SQL знал, как генерировать SQL?

5
задан stucampbell 9 August 2010 в 15:11
поделиться