Linq: синтаксис запроса, где оператор не понимает предикаты типа Expression - PullRequest
3 голосов
/ 07 ноября 2011

Я определил спецификацию как объект типа 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 Ответ

3 голосов
/ 07 ноября 2011

Ваше выражение запроса переводится на:

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;
...