0

我正在开发一个 ASP.NET MVC 应用程序。我有两个查询我想从这些查询中获取公共记录。

我想写简单的连接来获取公共记录吗?

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

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 = poList.Join(poList2).ToList();
4

3 回答 3

0

Union 将为您提供两者的所有记录:http: //msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx

Join 方法将为您提供与提供的密钥匹配的记录,但需要的不仅仅是两个枚举作为参数:http: //msdn.microsoft.com/en-us/library/bb534675.aspx

于 2013-07-09T05:07:54.963 回答
0

您可以使用 Join 方法的重载来指定连接条件:

poList.Join(poList2, a => a.Name, b => b.Name, (a,b) => new { Name = b.PONo, Id = b.Id });

于 2013-07-09T05:12:36.750 回答
0

您不需要连接,因为您可以将第一个查询中的表达式应用于第二个查询的“原始”结果:

var poList2 = db.Employees.Where(x => x.Id == EmpID)
                .SelectMany(x => x.Roles)
                .SelectMany(x => x.Employees)
                .Distinct()
                .SelectMany(x => x.PurchaseOrders);

var result = from po in poList2
             where po.CompanyId == companyId && 
                   po.PartyId == partyId && 
                   !po.IsDeleted
             select po into newPO
             select new
             {
                 Name = newPO.PONo,
                 Id = newPO.Id    
             }; 

如果您需要您最初打算从中获得的结果poList2

var result2 = poList2.Select(po => 
              {
                  Name = po.PONo,
                  Id = po.Id    
              }; 

因此,一般来说,如果您将投影推迟到匿名类型,您可以对查询主体做更多的事情。

旁注:我使用它!po.IsDeleted是因为我强烈建议使该字段不可为空,并使用false默认值。

于 2016-02-08T19:21:38.963 回答