我的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'。我在这里显然遗漏了一些东西......
答案 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尝试了这一点,并得到了相同的结果。
我希望这会有所帮助