c# – Linq在可空字段上离开了连接
在下面的示例中,我有entity1,其中user_id是可以为null的int,有时它确实为null. Entity2类似于通过user_id将entity1连接到entity3的桥梁,以获取person_id并最终获得相应的fullname.
我的目标是编写一个linq查询,其中如果entity1的user_id为null,则不抛出NullReferenceException,但为fullname属性获取null. 鉴于以下实体,我希望我的查询返回: > codeOfEntity =“21006.040”,fullname = null 实体: class entity1 { public int? user_id { get; set; } public string codeOfEntity { get; set; } } class entity2 { public int user_id { get; set; } public int person_id { get; set; } } class entity3 { public int person_id { get; set; } public string fullname { get; set; } } 并填写如下: var listOfEntity1 = new List<entity1>() { new entity1() { user_id = null,codeOfEntity = "21006.040" },new entity1() { user_id = 10,codeOfEntity = "14006.010" },new entity1() { user_id = null,codeOfEntity = "21006.020" },new entity1() { user_id = 1,codeOfEntity = "35716.001"},new entity1() { user_id = 4,codeOfEntity = "11153.013" } }; var listOfEntity2 = new List<entity2>() { new entity2() { user_id = 1,person_id = 100 },new entity2() { user_id = 4,person_id = 400 },new entity2() { user_id = 10,person_id = 1000 } }; var listOfEntity3 = new List<entity3>() { new entity3() { person_id = 100,fullname = "John Smith" },new entity3() { person_id = 400,fullname = "Dave Doe" },new entity3() { person_id = 1000,fullname = "Zach White" } }; 我的查询抛出NullReferenceException: var result = (from e1 in listOfEntity1 join e2 in listOfEntity2 on e1.user_id equals e2.user_id into e2Group from e2 in e2Group.DefaultIfEmpty() join e3 in listOfEntity3 on e2.person_id equals e3.person_id into e3Group from e3 in e3Group.DefaultIfEmpty() select new { e1.codeOfEntity,e3.fullname }).ToList(); 谢谢. 解决方法
使用c#6.0的空传播
var result = (from e1 in listOfEntity1 join e2 in listOfEntity2 on e1.user_id equals e2.user_id into e2Group from e2 in e2Group.DefaultIfEmpty() join e3 in listOfEntity3 on e2?.person_id equals e3.person_id into e3Group from e3 in e3Group.DefaultIfEmpty() select new { e1.codeOfEntity,e3?.fullname }).ToList(); 注意连接条件和选择的简单更改.在连接中将e2.person_id更改为e2?.person_id,在select中将e3.fullname更改为e3?.fullname. 但是,如果你不能使用c#6.0,这里有另一种选择 var result = (from e1 in listOfEntity1 join e2 in listOfEntity2 on e1.user_id equals e2.user_id into e2Group from e2 in e2Group.DefaultIfEmpty() join e3 in listOfEntity3 on (e2==null?-1:e2.person_id) equals e3.person_id into e3Group from e3 in e3Group.DefaultIfEmpty() select new { e1.codeOfEntity,fullname=(e3==null?null:e3.fullname) }).ToList(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |