实体框架4 Linq帮助 - 从多个表中提取数据进行过滤

时间:2011-02-09 20:06:15

标签: entity-framework-4 linq-to-entities

不确定如何完成此操作,我设置了我的.edmx,以便导航属性与表上的外键关系匹配。不确定我是否仍需要执行连接,或者EF是否允许我自动通过导航属性访问相关的表数据。

enter image description here

我需要做的是根据ContentView获取所有ContentSections及其相关的ContentItem,并由DiversionProgram.CrimeNumber过滤。

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

由于

4 个答案:

答案 0 :(得分:0)

类似的东西:

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

我已解释

  

基于ContentView

cs.ContentView.ContentViewID == someID

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

  

由DiversionProgram.CrimeNumber

过滤

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

将为您提供具有特定CrimeNumber的所有ContentItem。

或者你的意思是基于/过滤的其他东西。也许是OrderBy,或所有那些ContentSections,其中任何一个ContentItems都会有某个CrimeNumber?

答案 1 :(得分:0)

您可以急于加载所有相关记录,但是当您想要开始过滤/订购时,请不要打扰Include

只需使用匿名类型进行投影,EF就会知道它需要做什么。它有点多毛,但它会起作用。如果它变得太复杂,咬紧牙关并使用SPROC。

现在,有了这个警告,就像这样(在我的头顶):

var query = ctx.ContentView
               .Select(x => new 
{
   ContentSections = x.ContentSections
                      .Where(y => y.ContentItems
                        .Any(z => z.DivisionProgram.CrimeNumber = 87))
}).ToList().Select(x => x.ContentSections);

答案 2 :(得分:0)

如果你使用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();

您可以在数据库第一个方案中了解有关CTP5及其如何使用的更多信息here

答案 3 :(得分:0)

 var query = from t1 in studentManagementEntities.StudentRegistrations
                        join t2 in studentManagementEntities.StudentMarks
                        on t1.StudentID equals t2.StudentID
                        select new
                        {
                            t1.selected column name,
                            t2.selected column name
                        };