2

我正在开发一个 MVC 应用程序。

我正在使用这两个查询来获取记录,并且我想从这些查询中获取公共记录。

我想返回列表中的数据集

像这样

return Json(poList, JsonRequestBehavior.AllowGet);

我的两个查询是..

 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);
4

3 回答 3

3

您不能合并它们的原因是这两个列表返回不同的对象。

第一个列表返回一个匿名类型,其中包含成员NameId。相反,如果您只想在查询一中返回采购订单,那么您可以简单地使用以下命令:

var poList = (
    from po in db.PurchaseOrders
    where po.CompanyId == companyId && 
          po.PartyId == partyId && 
          (po.IsDeleted == false || po.IsDeleted == null)
     select po
);

您可能需要附加.ToList()到上面的查询才能使用该Union(...)方法。然后,您应该能够将两个序列联合在一起(假设poList2也是一个db.PurhaseOrders对象序列。

相反,poList您可以将后面的查询更改poList2为以下,而不是更改上面的查询,以达到相同的效果,但结果不同:

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 查询来尝试使用该Union(...)方法。这是完全没有必要的。不妨为他/她写出代码:

var finalPO = poList.Union(poList2).ToList(); // ToList() only necessary if you need a list back

那应该这样做。

真的,我在下面的评论中提到的两本书将使您在理解 .NET 和 LINQ 方面有很长的路要走:APress - Pro C# 和 .NET Framework 4.0;O'Reilly - 简而言之 C# 5. 也有很多关于 LINQ 的书籍——但是如果没有扎实的掌握 .NET(和 C#、F# 或 VB),您就无法理解或使用 LINQ。

于 2013-07-08T12:56:57.897 回答
1

我认为您不需要 ToList() 在中间结果中,只需使用联合并在最终结果中执行 ToList ,例如:

var finalPO = poList.Union(poList2).ToList()
于 2013-07-08T17:18:15.777 回答
0

首先,像这样创建一个 ViewModel:

public class PurchaseOrderViewModel
{
   public int Id { get; set; }
   public string Name { get; set; }
}

然后,在您的代码中使用它,如下所示:

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);
于 2013-07-08T14:11:28.960 回答