关于asp.net mvc:连接两个查询并以列表格式返回

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


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

第一个列表返回一个匿名类型,成员为NameId。如果您只想返回查询1中的采购订单,那么您可以简单地使用以下内容:

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

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

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

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

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