У меня есть запрос, который должен быть снова использован повсеместно, и я должен варьироваться, какое свойство/столбец привыкает для соединения.
То, что я хотел бы смочь сделать, является чем-то как:
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?