我们班LINQ到实体 - 在EntityCollection导航属性搜索
public Invoice: EntityObject
{
public EntityCollection<InvoicePosition> Positions { get {...}; set{...}; }
...
}
public InvoicePosition: EntityObject
{
public string GroupName { get {...}; set{...}; }
}
我们给出IQueryable<Invoice>
,我们没有给出IQueryable<InvoicePosition>
。我应该如何查找具有职位的发票,其中GroupName是“燃料”?
IQueryable<Invoice> invoices = InvoiceRepository.List();
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
where ?
select i
EntityFramework应该能够将其转换为正确的sql查询。
编辑
正如马克·西曼写的,我可以用:
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(???);
但是,我应该在哪里写?
编辑
改变包括( “位置”),以包括( “位置”)。
编辑
亚历克斯·詹姆斯给了链接到尖端(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包括。
感谢您的提示。最后添加Include是有问题的,因为我使用了存储库模式,并且首先应用了包含。中间解决方案(使用Any())适合我。 – LukLed 2009-11-08 18:58:28