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;
Другие вопросы по тегам