不确定如何完成此操作,我设置了我的.edmx,以便导航属性与表上的外键关系匹配。不确定我是否仍需要执行连接,或者EF是否允许我自动通过导航属性访问相关的表数据。
我需要做的是根据ContentView获取所有ContentSections及其相关的ContentItem,并由DiversionProgram.CrimeNumber过滤。
我想回到IEnumerable,对于每个ContentSection,它应该可以通过导航属性ContentItems访问它的ContentItems
由于
答案 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
};