C# RIA服务:包括选择(多个)不工作

C# RIA服务:包括选择(多个)不工作,c#,wcf,entity-framework,ria,C#,Wcf,Entity Framework,Ria,我有两种实体类型:文档(有一个客户)和客户(有一个集合文档) 我的查询是根据客户的姓名或号码获取客户的文档 查询如下所示: public IQueryable<Document> GetCustomerDocuments(DateTime startDate, DateTime endDate, string filterText) { return this.ObjectContext.Customers .Where(c => c.Cus

我有两种实体类型:
文档
(有一个
客户
)和
客户
(有一个集合
文档

我的查询是根据客户的姓名或号码获取客户的文档

查询如下所示:

public IQueryable<Document> GetCustomerDocuments(DateTime startDate, DateTime endDate, string filterText)
{
    return this.ObjectContext.Customers
              .Where(c => c.CustomerName.Contains(filterText) || c.CustomerNumber.Contains(filterText))
              .SelectMany(c => c.Documents)
              .Where(d => d.Date >= startDate && d.Date <= endDate);
}
public IQueryable GetCustomerDocuments(日期时间开始日期、日期时间结束日期、字符串筛选器文本)
{
返回this.ObjectContext.Customers
.Where(c=>c.CustomerName.Contains(filterText)| | c.CustomerNumber.Contains(filterText))
.SelectMany(c=>c.Documents)

。其中(d=>d.Date>=startDate&&d.Date
。Include
用于ObjectQuery,添加任何自定义投影时其效果将撤消。您可以尝试以下选项:

根据文档重写查询:

return this.ObjectContext.Documents.Include("Customers")
          .Where(d => d.Customers.Any(c => 
                                      c.CustomerName.Contains(filterText) 
                                   || c.CustomerNumber.Contains(filterText))
          .Where(d => d.Date >= startDate && d.Date <= endDate);
然后您的查询变成:

return from c in this.ObjectContext.Customers
       from d in c.Documents
       where (c.CustomerName.Contains(filterText) 
          || c.CustomerNumber.Contains(filterText))
           && d.Date >= startDate && d.Date <= endDate
       select new CustomerDocument {Customer = c, Document = d};
在this.ObjectContext.Customers中从c返回
从d到c.文件
其中(c.CustomerName.Contains)(filterText)
||c.CustomerNumber.Contains(filterText))

&&d.Date>=startDate&&d.Date
。Include
可用于ObjectQuery,添加任何自定义投影时,其效果将撤消。您可以尝试以下选项:

根据文档重写查询:

return this.ObjectContext.Documents.Include("Customers")
          .Where(d => d.Customers.Any(c => 
                                      c.CustomerName.Contains(filterText) 
                                   || c.CustomerNumber.Contains(filterText))
          .Where(d => d.Date >= startDate && d.Date <= endDate);
然后您的查询变成:

return from c in this.ObjectContext.Customers
       from d in c.Documents
       where (c.CustomerName.Contains(filterText) 
          || c.CustomerNumber.Contains(filterText))
           && d.Date >= startDate && d.Date <= endDate
       select new CustomerDocument {Customer = c, Document = d};
在this.ObjectContext.Customers中从c返回
从d到c.文件
其中(c.CustomerName.Contains)(filterText)
||c.CustomerNumber.Contains(filterText))

&&d.Date>=startDate&d.Date我没有使用投影和
SelectMany
,而是使用连接编写了一个LINQ查询:

        var v = from cust in (from c in this.ObjectContext.Customers
                where  (c.CustomerName.Contains(filterText) || c.CustomerNumber.Contains(filterText))  select c)
                join doc in this.ObjectContext.Documents on cust.CustomerNumber equals doc.CustomerNumber
                where doc.Date >= startDate && doc.Date <= endDate
                select doc;
        return ((ObjectQuery<Document>)v).Include("Customer").AsQueryable<Document>();
var v=来自cust in(来自this.ObjectContext.Customers中的c
其中(c.CustomerName.Contains(filterText)| | c.CustomerNumber.Contains(filterText))选择c)
在cust.CustomerNumber上的this.ObjectContext.Documents中加入doc等于doc.CustomerNumber

如果doc.Date>=startDate&&doc.Date而不是使用投影和
SelectMany
,我使用连接编写了一个LINQ查询:

        var v = from cust in (from c in this.ObjectContext.Customers
                where  (c.CustomerName.Contains(filterText) || c.CustomerNumber.Contains(filterText))  select c)
                join doc in this.ObjectContext.Documents on cust.CustomerNumber equals doc.CustomerNumber
                where doc.Date >= startDate && doc.Date <= endDate
                select doc;
        return ((ObjectQuery<Document>)v).Include("Customer").AsQueryable<Document>();
var v=来自cust in(来自this.ObjectContext.Customers中的c
其中(c.CustomerName.Contains(filterText)| | c.CustomerNumber.Contains(filterText))选择c)
在cust.CustomerNumber上的this.ObjectContext.Documents中加入doc等于doc.CustomerNumber

where doc.Date>=startDate&&doc.Date这正是我所害怕的。我本来差不多是按照你的第一种方式来做的,但是当我必须通过
文档
才能到达
客户
时,它的速度太慢了,所以我试图做相反的事情。不过我甚至没有想到DTO对象。这是一个好主意。(虽然最终会复制客户信息,对吗?)可能是的。除非RIA服务基础设施会以某种方式处理这一问题,但我怀疑它会这样做(如果返回列表中具有相同Id的两个客户的引用相等,您可以通过验证客户端来测试这一点).这正是我所担心的。最初我差不多是按照你的第一种方式来做的,但当我必须通过
文档
才能到达
客户时,结果速度太慢了,所以我试着做相反的事情。虽然我甚至没有想到DTO对象。这是一个好主意。(虽然最终会复制客户信息,对吗?)可能是的。除非RIA服务基础设施会以某种方式处理这一问题,但我怀疑它会这样做(如果返回列表中具有相同Id的两个客户的引用相等,您可以通过验证客户端来测试这一点).Absolute life saver和Complete non-Operative可将查询结果强制转换为ObjectQuery。请将其标记为答案。Absolute life saver和Complete non-Operative可将查询结果强制转换为ObjectQuery。请将其标记为答案。