Joining of two queries and returning in list format
我正在开发MVC应用程序。
我正在使用这两个查询来获取记录,我想从这些查询中获取公共记录。
我想返回列表中的数据集
这样地
1 | return Json(poList, JsonRequestBehavior.AllowGet); |
我的两个问题是……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var poList = (from po in db.PurchaseOrders where po.CompanyId == companyId && po.PartyId == partyId && (po.IsDeleted == false || po.IsDeleted == null) select po into newPO select new { Name = newPO.PONo, Id = newPO.Id }); //.ToList().OrderBy(e => e.Name); var poList2 = (db.Employees.Where(x => x.Id == EmpID) .SelectMany(x => x.Roles) .SelectMany(x => x.Employees) .Distinct() .SelectMany(x => x.PurchaseOrders) .Select(po => new { Name = po.PONo, Id = po.Id })); var finalPO = from PO in poList.ToList().Union(poList2).ToList() select PO); |
您不能合并它们的原因是这两个列表返回不同的对象。
第一个列表返回一个匿名类型,成员为
1 2 3 4 5 6 7 | var poList = ( from po in db.PurchaseOrders where po.CompanyId == companyId && po.PartyId == partyId && (po.IsDeleted == false || po.IsDeleted == null) select po ); |
为了使用
相反,您可以将
1 2 3 4 5 6 | var poList2 = (db.Employees.Where(x => x.Id == EmpID) .SelectMany(x => x.Roles) .SelectMany(x => x.Employees) .Distinct() .SelectMany(x => x.PurchaseOrders) .Select(po => new { Name = po.PONo, Id = po.Id })); |
就个人而言,我认为第一个更清楚(除非po对象上有许多字段,并且您只需要如图所示的两个字段)。
更新:我看到原来的帖子被编辑,这样两个查询现在都返回相同的对象(或对象的形状)。然而,海报仍然试图错误地组合结果。海报正在使用另一个LINQ查询来尝试使用
1 | var finalPO = poList.Union(poList2).ToList(); // ToList() only necessary if you need a list back |
这应该可以做到。
实际上,我在下面的评论中提到的这两本书会让你在理解.NET和Linq方面有很长的路要走:apress-pro c和.NET框架4.0;o'reilly-c_5。也有很多关于LINQ的书——但是如果没有对.NET(和C,F,或VB)的扎实掌握,你就不希望理解或使用LINQ。
我认为您不需要中间结果中的tolist(),只需要使用union并在最终结果中执行tolist,例如:
1 | var finalPO = poList.Union(poList2).ToList() |
首先,创建这样的视图模型:
1 2 3 4 5 | public class PurchaseOrderViewModel { public int Id { get; set; } public string Name { get; set; } } |
然后,在代码中使用它,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var poList1 = (from po in db.PurchaseOrders where po.CompanyId == companyId && po.PartyId == partyId && (po.IsDeleted == false || po.IsDeleted == null) select po into newPO select new PurchaseOrderViewModel { Name = newPO.PONo, Id = newPO.Id }).ToList(); var poList2 = (db.Employees.Where(x => x.Id == EmpID) .SelectMany(x => x.Roles) .SelectMany(x => x.Employees) .Distinct() .SelectMany(x => x.PurchaseOrders) .Select(po => new PurchaseOrderViewModel { Name = po.PONo, Id = po.Id })).ToList(); var finalList = poList1.Union(poList2); |