2013-07-08 37 views
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); 
+0

Try:var finalPO = from po in poList.ToList()。Union(poList2。ToList()) – CoffeeCode

+0

Nop ...不工作... – bnil

+0

閱讀此篇文章:http://stackoverflow.com/questions/4844660/differences-between-iqueryable-list-ienumerator/4844755它應該可以幫助你解決問題 –

回答

1

我不認爲你需要的ToList()在中間結果,只需使用union並在最終結果中執行ToList,如:

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

的原因,你不能聯合他們的是,兩個列表返回不同的對象。

的第一列表返回一個匿名類型與成員NameId。相反,如果你只是想在一個查詢返回的採購訂單,那麼你可以簡單地使用下列內容:

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

您可能需要爲了使用Union(...)方法追加.ToList()到上述查詢。然後,你應該能夠聯合兩個序列一起(假設poList2db.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很長的路要走:A按 - 臨C#和.NET Framework 4.0; O'Reilly - C#5簡介。也有對LINQ許多單獨的書籍 - 但沒有.NET(和C#,F#,VB或)紮實抓好,你不能希望瞭解或使用LINQ。

+0

對不起...完全困惑... – bnil

+0

我建議你閱讀一本關於.NET和LINQ的好書。嘗試一下Apress的書Pro C#和.NET Framework 4.0,或O'Reilly的C#。我上面描述的是爲了有效使用LINQ需要理解的基本知識。 – fourpastmidnight

+0

請檢查更新後的問題...我瞭解有關加入的不同之處?它在最後陳述中顯示錯誤。 – bnil

0

首先,創建一個視圖模型是這樣的:

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

在哪裏寫Viewmodel?同班 ? – bnil

+0

不,您的ViewModels文件夾中有一個單獨的類。我假設你想將finalList傳遞給View。 – ataravati