我有两种实体类型: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);
}
当查询返回时,我希望它包含Document
和Customer
个实体....
我已尝试过我能想到的所有内容,包括Include("Documents.Customer")
,Include("Customer")
等。
我确实在元数据中设置了IncludeAttribute
。
思考?这甚至可能吗?
谢谢!
答案 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};