WCF DataService 5任何单个实体(客户端)

时间:2012-06-14 09:41:06

标签: silverlight wcf-data-services

根据WCF数据服务5.0.1任何/所有功能,我有一个问题。我想在Silverlight 5应用程序中使用它,我想查询一个名为“Employee”的实体(具有唯一的EmpNo = personalNr)并检查它是否已经存在(因此,我检查是否有一个具有相同personalNrfor的Employee验证目的)..

在旧版本中,无法在客户端上执行此操作。我不得不在服务器上调用一个返回布尔值的自定义服务操作。

有没有办法在客户端喜欢这样做(并得到一个布尔值):

bool result = this.Context.Employees.Any(e => e.PersonalNr.Equals(personalNr, StringComparison.OrdinalIgnoreCase));

提前致谢!

史蒂夫

1 个答案:

答案 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)用于仅询问与条件匹配的第一个值。由于我们只会使用结果的存在,我们不需要向服务询问所有结果(小优化)。