Linq: синтаксис запроса, где оператор не понимает предикаты типа Expression
Я определил спецификацию как объект типа Expression<Func<User, bool>>
как это:
public static Expression<Func<User, bool>> IsSystemUser
{
get
{
return user => user.UserID == -1;
}
}
Это прекрасно работает с запросами, написанными в синтаксисе метода расширения:
return workspace.GetDataSource<User>().Where(UserSpecifications.IsSystemUser);
Но не с синтаксисом запроса Linq:
return from user in workspace.GetDataSource<User>() where UserSpecifications.IsSystemUser select user;
Компилятор дает мне cannot implicitly convert type 'Expression<Func<User, bool>>' to 'bool'
,
Что дает? Я думал, что синтаксис запроса Linq - это просто симпатичная DSL, которая украсила синтаксис метода расширения. Может кто-нибудь сказать мне, как я могу использовать мои прекрасные спецификации с синтаксисом запроса Linq?
1 ответ
Ваше выражение запроса переводится на:
return workspace.GetDataSource<User>()
.Where(user => UserSpecifications.IsSystemUser);
Лямбда-выражение вводится неявно - но вы не хотите его в этом случае. Так что не используйте синтаксис выражения запроса... Учитывая, что здесь синтаксис выражения запроса длиннее, чем непосредственное использование методов расширения, и вводит больше лукавства, зачем вам это?
Обратите внимание, что вы можете смешивать и сочетать, как это:
return from user in workspace.GetDataSource<User>()
.Where(UserSpecifications.IsSystemUser)
where user.Name == "Bob"
orderby user.ID
select user;