【发布时间】:2009-11-08 10:30:46
【问题描述】:
我们有课
public Invoice: EntityObject
{
public EntityCollection<InvoicePosition> Positions { get {...}; set{...}; }
...
}
public InvoicePosition: EntityObject
{
public string GroupName { get {...}; set{...}; }
}
我们得到了IQueryable<Invoice>,我们没有得到IQueryable<InvoicePosition>。我应该如何找到包含 GroupName 为“Fuel”的职位的发票?
IQueryable<Invoice> invoices = InvoiceRepository.List();
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
where ?
select i
EntityFramework 应该能够将其转换为正确的 sql 查询。
编辑
正如 Mark Seemann 所写,我可以使用:
IQueryable<Invoice> invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude");
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
from p in i.Positions
where p.GroupName = 'Fuel'
select i;
有问题。当我使用这个过滤器时,我失去了“OtherInclude”。我认为在使用 EF 时这不是正确的过滤方式。我得把它改成:
IQueryable<Invoice> invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude");
IQueryable<Invoice> invoicesThatHaveFuelPositions = invoices.Where(???);
但是我应该在哪里写什么呢?
编辑
将 Include("Position") 更改为 Include("Positions")。
编辑
Alex James 给出了提示的链接 (http://blogs.msdn.com/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx),这表明:
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
where i.Positions.Any(p => p.GroupName == 'Fuel')
select i;
它似乎工作并且不影响 EF 包含。
【问题讨论】:
标签: linq entity-framework linq-to-entities