C# 高级LINQ查询帮助
因此,我有以下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
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);