RIA服务:包括选择(许多)不工作

时间:2012-01-20 15:28:26

标签: c# wcf entity-framework ria

我有两种实体类型:Document(有一个Customer)和Customer(有一个集合Documents

我的疑问是根据客户的姓名或号码为客户提供文件。

查询如下所示:

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);
}

当查询返回时,我希望它包含DocumentCustomer个实体....

我已尝试过我能想到的所有内容,包括Include("Documents.Customer")Include("Customer")等。

我确实在元数据中设置了IncludeAttribute

思考?这甚至可能吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

我没有使用投影和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>();

这解决了这个问题!

答案 1 :(得分:0)

.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);

这可能会也可能不会起作用,可能会也可能不会生成正常的sql;待测试。

另一种可能性是定义DTO对象

class CustomerDocument
{
   public Customer {get;set;}
   public Document {get;set;}
}

然后您的查询变为:

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};