使用Linq过滤孩子的父母

时间:2010-12-21 22:52:17

标签: silverlight linq ria

我的Silverlight应用程序(使用RIA服务)遇到一些问题会过滤我的结果。我的想法是在客户端上设置EntityQuery及其过滤器和调用负载。但这不适合我。

继承我的代码。

public void FireQuery(string filterValue)
{
    EntityQuery<Parent> query = m_ParentDomainContext.GetParentQuery();
    query = query.Where(p => p.Children.Any(c => c.Name.Contains(filterValue)));
    m_ParentDomainContext.Load(query, Query_Completed, null);
}

编译得很好,但是,运行时我得到“查询运算符'Any'不受支持。”例外。 有谁知道这样过滤的好方法?再一次,我正在寻找一种方法在客户端上设置它。

编辑:我应该注意,我也尝试过其他几个问题,结果相似:

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).Count() != 0);

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).FirstOrDefault != null);

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).Any());

不支持查询运算符'Count / FirstOrDefault / Any'。我在这里显然遗漏了一些东西......

1 个答案:

答案 0 :(得分:1)

当我尝试使用它时,我发现像First,Any和Count这样的方法不能与LINQ to Entities(我相信,甚至是NHibernate)一起使用,而不是WCF RIA服务,因为它们'我没有在IQueryable本身上定义,但是,instread是System.Linq命名空间中定义的扩展方法。这正是为什么它显示为运行时异常而不是编译时错误的原因。这里可以使用的唯一扩展方法是System.ServiceModel.DomainServices.Client中的扩展方法(例如Where,Skip,Take,OrderBy等)。

这与“EntityQuery”对象有关,因为那些需要编写并发送回服务器,而对于集合(例如你的m_ParentDomainContext.Parents),你可以使用{{ 1}}扩展方法自由。

为了实现这个功能,我建议,正如Thomas Levesque所说,从服务器公开它以便只获取你想要的数据,或者,你可以使用可用的结构组成一个查询(在System.Linq)中,然后对结果数据应用其他过滤器(您可以使用System.ServiceModel.DomainServices.Client命名空间中的扩展方法)。

PS:我使用经典实体框架和实体框架CodeFirst尝试了这一点,并得到了相同的结果。

我希望这会有所帮助

相关问题