2

MVC アプリケーションを開発しています。

2 つのクエリを使用してレコードを取得しています。これらのクエリから共通のレコードを取得したいと考えています。

データセットをリストに戻したい

このような

return Json(poList, JsonRequestBehavior.AllowGet);

私の2つのクエリは..

 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

それらを結合できない理由は、2 つのリストが異なるオブジェクトを返すためです。

Name最初のリストは、メンバーおよびを持つ匿名型を返しますId。代わりに、クエリ 1 で発注書を返したいだけの場合は、次のように単純に使用できます。

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

.ToList()メソッドを使用するには、上記のクエリに追加する必要がある場合がありますUnion(...)。次に、2 つのシーケンスを結合できるはずです (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 オブジェクトに多くのフィールドがあり、示されているように 2 つだけが必要な場合を除きます)。

更新:元の投稿が編集され、両方のクエリが同じオブジェクト (またはオブジェクトの形状) を返すようになりました。ただし、投稿者はまだ結果を誤って結合しようとしています。投稿者は、メソッドを使用しようとして、さらに別の LINQ クエリを使用していますUnion(...)。これは完全に不要です。彼/彼女のためにコードを書き出すこともできます:

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

それはそれを行う必要があります。

実際、以下のコメントで言及した 2 冊の本は、.NET と LINQ を理解する上で大いに役立ちます。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 に答える