any/all 功能仅在过滤器表达式中可用,用于根据相关实体或集合属性进行查询。如果您只想检查是否存在没有任何关系的员工,您可以在没有任何/全部的情况下执行此操作。这个想法是简单地过滤给定条件下的所有员工,看看你是否至少得到 1 个结果。
现在,由于您在 Silverlight 中执行此操作,因此操作必须是异步的,因此像上面这样的简单语句将不起作用。您可以执行以下操作:
var query = (DataServiceQuery<Employee>)this.Context.Employees.Where(e => e.PersonalNr.ToLower() == personalNr.ToLower()).Take(1);
query.BeginExecute((ar) =>
{
var results = query.EndExecute(ar);
// The usage of Any here is simply because it's the easiest way to do this
// and it is not used over OData/WCF DS, this is simply checking if the results returned
// from the service contain at least one result.
bool employeeExists = results.Any();
}, null);
关于上面代码的几点说明:
WCF 数据服务不支持带有比较选项的 Equals 方法,OData 协议也不支持不区分大小写的字符串比较。因此,要解决此问题,只需在比较之前将所有值转换为小写即可。
Take(1) 仅用于请求与条件匹配的第一个值。由于无论如何我们只会使用结果的存在性,因此我们不需要向服务询问所有结果(小优化)。