Entity framework 4 实体框架4 Linq帮助-从多个表中提取数据

Entity framework 4 实体框架4 Linq帮助-从多个表中提取数据,entity-framework-4,linq-to-entities,Entity Framework 4,Linq To Entities,我不确定这是如何完成的,我已经设置了我的.edmx,以便导航属性与表上的外键关系相匹配。不确定我是否仍然需要执行联接,或者EF是否会自动通过导航属性让我访问相关的表数据 我需要做的是基于ContentView获取所有ContentSection及其关联的ContentItems,并通过DiversionProgram.CrimeNumber进行过滤 我想返回IEnumerable,对于每个ContentSection,它应该可以通过导航属性ContentItems访问其ContentItems

我不确定这是如何完成的,我已经设置了我的.edmx,以便导航属性与表上的外键关系相匹配。不确定我是否仍然需要执行联接,或者EF是否会自动通过导航属性让我访问相关的表数据

我需要做的是基于ContentView获取所有ContentSection及其关联的ContentItems,并通过DiversionProgram.CrimeNumber进行过滤

我想返回IEnumerable,对于每个ContentSection,它应该可以通过导航属性ContentItems访问其ContentItems

谢谢

类似于:

using(Entities context = new Entities())
{
  IEnumerable<ContentSection> enumerator = context.ContentSections
  .Include("ContentItems")
  .Where<ContentSection>(cs => cs.ContentView.ContentViewID == someID && cs.ContentItems.Where<ContentItem>(ci => ci.DiversionProgram.CrimeNumber == someCrimeNumber))
  .AsEnumerable<ContentSection>
}
使用(实体上下文=新实体()
{
IEnumerable枚举数=context.ContentSections
.包括(“内容项”)
.Where(cs=>cs.ContentView.ContentViewID==someID&&cs.ContentItems.Where(ci=>ci.DiversionProgram.CrimeNumber==someCrimeNumber))
.可计算
}
我翻译过

基于ContentView

as
cs.ContentView.ContentViewID==someID

这将为您提供给定ContentView的所有ContentSection。并解释

已由DiversionProgram.CrimeNumber过滤

as
cs.ContentItems.Where(ci=>ci.DiversionProgram.CrimeNumber==someCrimeNumber)

这将为您提供所有具有特定CrimeNumber的ContentItems

或者你指的是基于/过滤的其他内容。可能是OrderBy,或者所有那些ContentSection,其中的任何ContentItems都会有特定的CrimeNumber?

您可以急于加载以获取所有关联的记录,但是当您想要开始筛选/排序时,不要麻烦使用
包含

只要用匿名类型做一个投影,EF就会知道它需要做什么。这有点毛茸茸的,但会管用的。如果事情变得太复杂,咬紧牙关,进行一次大爆发

现在,有了这个警告,类似这样的事情(从我的头顶上):


如果您使用CTP5,您可以做一些非常独特的事情,它看起来如下所示:

var context = new YourEntitiesContext();

var query = context.ContentView.Include(cs => cs.ContentSections
                   .Select(ci => ci.ContentItems
                   .Select(dp => dp.DiversionProgram)
                   .Where(dp.CrimeNumber == crimeNumber)))
                   .Where(cv => cv.ContentViewID == contentViewID).FirtsOrDefault();
您可以从studentManagementEntities.StudentRegistrations中的t1了解有关CTP5的更多信息,以及如何在数据库优先方案中使用它 加入学生管理实体。学生分数 在t1.StudentID等于t2.StudentID 选择新的 { t1.选定的列名, t2.选定的列名 };
您是否正在建立犯罪网络?我能参加吗当然很容易加入。。。只要找到你当地的警察,给他一记耳光,你就会立刻成为网络的一部分!使用示例时,LOLgetting错误无法将运算符“&&”应用于bool和IEnumerable类型的操作数。我明白了。如果你使用任何一个,而不是在你有更多机会的地方。但结果会有所不同。但是试着看看它是否满足你的需要。如果没有,回到这里,我们会进一步考虑。这是CTP5独有的吗?这是基本的LINQ实体。而且在投影时不需要包含……是的,在EF4 CTP5.ahh之前,不能在LINQ to实体中使用类型化包含。我很困惑,因为您没有指定代码的哪一部分是“唯一的”。我的错。
var context = new YourEntitiesContext();

var query = context.ContentView.Include(cs => cs.ContentSections
                   .Select(ci => ci.ContentItems
                   .Select(dp => dp.DiversionProgram)
                   .Where(dp.CrimeNumber == crimeNumber)))
                   .Where(cv => cv.ContentViewID == contentViewID).FirtsOrDefault();