根据WCF数据服务5.0.1任何/所有功能,我有一个问题。我想在Silverlight 5应用程序中使用它,我想查询一个名为“Employee”的实体(具有唯一的EmpNo = personalNr)并检查它是否已经存在(因此,我检查是否有一个具有相同personalNrfor的Employee验证目的)..
在旧版本中,无法在客户端上执行此操作。我不得不在服务器上调用一个返回布尔值的自定义服务操作。
有没有办法在客户端喜欢这样做(并得到一个布尔值):
bool result = this.Context.Employees.Any(e => e.PersonalNr.Equals(personalNr, StringComparison.OrdinalIgnoreCase));
提前致谢!
史蒂夫
答案 0 :(得分:0)
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)用于仅询问与条件匹配的第一个值。由于我们只会使用结果的存在,我们不需要向服务询问所有结果(小优化)。