我将规范定义为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查询语法?
您的查询表达式正在被翻译成:
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;