0

根据 WCF Data Services 5.0.1 Any/All-Features,我有一个问题。我想在 Silverlight 5 应用程序中使用它,并且我想查询一个名为“Employee”的实体(具有唯一的 EmpNo=personalNr)并检查它是否已经存在(因此,我检查是否存在具有相同 personNrfor 的 Employee验证目的)..

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

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

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

提前致谢!

史蒂夫

4

1 回答 1

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

于 2012-06-14T13:43:13.163 回答