加入两个查询并以列表格式返回

时间:2013-07-08 12:49:43

标签: asp.net-mvc linq

我正在开发一个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);

3 个答案:

答案 0 :(得分: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 in a Nutshell。还有很多关于LINQ的书籍 - 但是如果没有扎实的.NET(以及C#,F#或VB),你就无法理解或使用LINQ。

答案 1 :(得分:1)

我不认为你需要中间结果中的ToList(),只需使用union并在最终结果中执行ToList,如:

var finalPO = poList.Union(poList2).ToList()

答案 2 :(得分: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);