尽管在客户端组成了EntityQuery,但SL List.count()中的WCF RIA服务获取项目总数

时间:2011-04-18 00:13:01

标签: silverlight linq-to-sql wcf-ria-services

我有一个SL4应用程序,它使用WCF RIA服务和LINQ2SQL。

我在客户端编写EntityQuery,并希望获取服务器端列表中的项目数,但List.count()没有考虑设置的EntityQuery对象。显示项目总数,但将正确数量的项目发送给客户端。

DomainService方法:

public IQueryable<Invoice> GetMyInvoices(string userID, int numberInCache)
    {
        IQueryable<Invoice> myList = this.DataContext.Invoices.Where(s => s.userID == userID);

        if (numberInCache > 0)
        {
            if (myList.Count() == numberInCache)
            {
                return null;
            }
        }
        return myList;
    }

在客户端:

EntityQuery<Invoice> query = myDataContext.GetMyInvoicesQuery(userID, numberInCache).Where(i => i.deliveryDate.month == 4);

        LoadOperation<Invoice> lo = tetelSearchContext.Load(query,
            (result) =>
            {
                if (!result.HasError)
                {
                    foundTetels = result.Entities;
                }
                else
                {
                    MessageBox.Show(result.Error.Message);
                    result.MarkErrorAsHandled();
                }
            }
        , null);

在客户端,我得到了正确的列表计数,但在服务器端,没有考虑到deliveryDate.month过滤器。

我错了什么?

提前致谢

的Gabor


感谢您的澄清。

在我的情况下,应用程序必须预见请求的对象何时是客户端实体集的子集。

我想,最简单的方法是在客户端上过滤EntitySet并在服务器上应用相同的过滤器之后比较对象的计数。

只有在计数不同时,应用程序才必须从服务器下载记录。

在输出缓存中,当过滤器有新参数时,会在每种情况下从服务器重新加载对象,尽管记录在客户端上,因为它们是先前结果集的子集。

例如:请求第一季度的发票,然后在1月份请求发票。

因为我有很多条件,所以不清楚客户端是否包含客户端上的所有记录。 (如果我们在1月份要求所有发票,在第一季度收到付款发票后,如果所有发票都在1月份支付,则客户实体集将仅包含所有记录。)

所以我想,首先获取服务器上的对象数量然后根据需要下载EntitySet会更有效。

有人有更好的解决方案吗?

提前致谢,

的Gabor。

1 个答案:

答案 0 :(得分:0)

好吧,首先让我告诉你RIA服务是如何运作的。

  1. RIA客户端撰写查询
  2. RIA客户端将一些复杂的XML发送到服务器
  3. RIA服务(在服务器端)首先调用GetMyInvoices
  4. 请注意,您的客户的查询尚未应用
  5. 然后RIA服务获取方法GetMyInvoices
  6. 返回的查询的返回值
  7. RIA Services现在应用客户端发送的XML
  8. RIA Services将结果返回给客户
  9. 现在看看你的第3步,在你的GetMyInvoices中,你正在对你的Context应用一个小查询,无论客户端发送了什么。您的客户端的撰写查询过滤器将在最后一步应用。

    相反,你必须在客户端一个接一个地调用两个查询, 1.首先获取结果计数 2.如果不匹配则获取您的记录

    然而出于好奇,乳清你是否愿意在服务器端看到任何东西?让服务器直接向您发送日期查询结果,因为您可以实现分页等,通过拆分这样的查询并管理客户端和服务器端查询,您将无法获得出色的性能。