Linq:查询语法,其中运算符不理解Expression类型的谓词

时间:2011-11-07 13:29:05

标签: linq expression-trees specification-pattern linq-query-syntax

我已将规范定义为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 个答案:

答案 0 :(得分:3)

您的查询表达式正在翻译成:

return workspace.GetDataSource<User>()
                .Where(user => UserSpecifications.IsSystemUser);

lambda表达式是隐式引入的 - 但在这种情况下你不需要它。因此,不要使用查询表达式语法...鉴于此处查询表达式语法更长比直接使用扩展方法,并引入更多瑕疵,为什么要这样?

请注意,可以混合搭配,如下所示:

return from user in workspace.GetDataSource<User>()
                             .Where(UserSpecifications.IsSystemUser)
       where user.Name == "Bob"
       orderby user.ID
       select user;