C# 高级LINQ查询帮助

C# 高级LINQ查询帮助,c#,linq-to-sql,C#,Linq To Sql,因此,我有以下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 n

因此,我有以下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
投影中,我使用嵌套查询来收集给定van的van分配。
vanAssignment
实体有一个person实体。那么如何在这个查询中加载
vanAssignment.person
属性呢

另外,我可以写这个来提高效率吗

谢谢你的帮助

编辑

下面是我上面的代码失败的地方:

在对上面的查询执行toList()之后,我将尝试访问所需的人员,如下所示:

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

   Console.WriteLine(objVan.person.firstName);

}
List lstVans=qryVans.toList();
foreach(显示货车中的objVan){
Console.WriteLine(objVan.person.firstName);
}
现在,由于我没有将person实体与vanAssignment实体一起加载,person导航属性为null,它会抛出一个错误

我的问题围绕着正确的方式来加载这个person实体以及分配


希望对你有所帮助。

你可以用这样的方法来完成人事分配

...
 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;
      }
}
。。。
modifiedDate=v.modifiedDate,
vanAssignments=GetVanAssignmentsWithPerson(v.vanAssignments.where(a=>a.VanID==v.VanID),person)
...
私有静态IEnumerable GetVanAssignmentsWithPerson(IEnumerable assignments,Person p)
{
foreach(分配中的var分配)
{
赋值人=p;
}
}

我不是Linq to sql专家,但我发现:

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

既然DisplayVan听起来像DTO,为什么不选择一个显式引用所需person属性的DisplayVanAssignment对象。

这不是问题的答案,而是(v.isOffline==1)?正确:错误不是必需的。只需使用(v.isOffline==1),因为它是一个布尔值。不需要条件表达式。我不理解这个问题。你能展示一下你使用的代码吗,在哪里失败了?嗨,戴夫。我正在使用MySQL连接器连接到一个不支持布尔类型的MySQL数据库。既然DisplayVan听起来像DTO,为什么不选择一个显式引用所需person属性的DisplayVanAssignment对象呢?John,谢谢。我认为这可能是最好的办法。你能在回答中提供这一评论吗?这样我就可以把这个问题标记为已解决?这很好,将被视为最后手段。理想情况下,我希望找到一种在查询中正确加载此信息的方法。
(from a in v.vanAssignments
where a.vanID == v.vanID
select new { Assignment = a, Person = a.Person }).Select(i => i.Assignment);