3

我已将规范定义为如下类型的对象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 查询语法一起使用?

4

1 回答 1

2

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

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;
于 2011-11-07T13:31:57.560 回答