2011-02-13 104 views
1

所以我有以下LINQ查询:高级LINQ查询帮助

var qryVans = from v in objContext.vans 

       join s in objContext.schools on v.schoolID equals s.schoolID 
       join l in objContext.locations on v.lastKnownLocationID equals l.locationID 

       select new DisplayVan { 
        vanID = v.vanID, 
        vanName = v.vanName, 
        phone = v.phone, 
        capacity = (int)v.capacity, 
        schoolName = s.schoolName, 
        lastLocationName = l.locationName, 
        statusNote = v.statusNote, 
        isOffline = (v.isOffline == 1) ? true : false, 
        isPrayerRoom = (v.isPrayerRoom == 1) ? true : false, 
        isNotReady = (v.isNotReady == 1) ? true : false, 
        creationDate = v.creationDate, 
        modifiedDate = v.modifiedDate, 
        vanAssignments = from a in v.vanAssignments 
            where a.vanID == v.vanID 
            select a 
       }; 

所有工作正常,但我需要填补VanAssignment实体的导航属性。请注意,在我的DisplayVan投影中,我使用嵌套查询来收集给定面包车的面包分配。 vanAssignment实体有一个人实体。那么如何在这个查询中加载vanAssignment.person属性?

另外,我可以写这个更有效吗?

感谢您的帮助!

编辑

这里就是我上面的代码失败:

后,我在查询执行toList()以上,我会尝试访问所需要的人是这样的:

List<DisplayVan> lstVans = qryVans.toList<DisplayVan>(); 
foreach(DisplayVan objVan in lstVans) { 

    Console.WriteLine(objVan.person.firstName); 

} 

现在,由于我没有使用vanAssignment实体加载person实体,因此person导航属性为null,并且会引发错误。

我的问题围绕正确的方式加载这个人实体以及vanAssignment?

希望有所帮助。

+1

这不是问题的答案,但(v.isOffline == 1)? true:false不是必需的。只需使用(v.isOffline == 1),因为它是一个布尔值。不需要条件表达式。 – 2011-02-13 16:47:34

+0

我不明白这个问题。你能否显示你使用的代码,哪里出错? – 2011-02-13 16:49:07

回答

1

由于DisplayVan听起来像一个DTO,你为什么不选择一个DisplayVanAssignment对象明确引用您需要的人员属性。

0

你可能有这样的事情的人分配

... 
modifiedDate = v.modifiedDate, 
vanAssignments = GetVanAssignmentsWithPerson(v.vanAssignments.where(a => a.VanID == v.vanID), person) 
... 

private static IEnumerable<Assignment> GetVanAssignmentsWithPerson(IEnumerable<Assignment> assignments, Person p) 
{ 
     foreach(var assignment in assignments) 
     { 
      assignment.person = p; 
     } 
} 
1

我不是LINQ to SQL的专家,但发现这一点:

DataLoadOptions dataLoadOptions = new DataLoadOptions(); 
dataLoadOptions.LoadWith<Assignment>(a => a.Person); 
objContext.LoadOptions = dataLoadOptions; 

设置DataLoadOptions会使人急于负载分配。

编辑

这项工作在EF肯定的,但也应该在工作的LINQ到SQL:

(from a in v.vanAssignments 
where a.vanID == v.vanID 
select new { Assignment = a, Person = a.Person }).Select(i => i.Assignment);