我有一个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。
答案 0 :(得分:0)
好吧,首先让我告诉你RIA服务是如何运作的。
现在看看你的第3步,在你的GetMyInvoices中,你正在对你的Context应用一个小查询,无论客户端发送了什么。您的客户端的撰写查询过滤器将在最后一步应用。
相反,你必须在客户端一个接一个地调用两个查询, 1.首先获取结果计数 2.如果不匹配则获取您的记录
然而出于好奇,乳清你是否愿意在服务器端看到任何东西?让服务器直接向您发送日期查询结果,因为您可以实现分页等,通过拆分这样的查询并管理客户端和服务器端查询,您将无法获得出色的性能。