2012-12-07 66 views
0

我有兩個表A和B,它們是完全獨立的,但都有一個time列,其類型爲DateTimeLINQ - 如何從兩個表中獲得n條記錄?

我需要寫一個簡單的LINQ查詢來獲得來自兩個表的10個最近(基於time字段)記錄,在一個集合中?例如,此查詢可能會返回A的7條記錄和B - 10記錄的3條記錄。

+0

您需要從表A連接表B.請看此頁:http://www.dotnetperls.com/join。它描述了LINQ如何實現連接。 – Carsten

+0

表A和B中是否有其他列與「時間」列一樣常見?因爲你沒有指定你想要查詢的輸出記錄。如果兩個表格完全不同,則可以創建匿名輸出記錄。如果A和B具有與聯盟相同的列, – pawciu

+0

這兩個表*可能*共享一列,具體取決於我的數據庫設計。你能舉兩個例子來表達你的意思嗎? –

回答

2
var _result = tableA 
       .Select(x => x.time) 
       .Union(tableB.Select(y => y.time)) 
       .OrderByDescending(z => z.time) 
       .Take(10); 

SOURCE

+0

'z.time'無法識別......?而且,這似乎只返回'time'列,導致'_result'成爲'IQueryable '。我不想只有時間,我想要所有的專欄......'時間'只應該用來確定哪10個記錄被選中。 –

+0

這個怎麼樣'變種_result = TABLEA \t \t \t .Union(tableB的) \t \t \t .OrderByDescending(Z => z.time) \t \t \t。取(10);'? –

+0

似乎並不工作,因爲'Union'只希望'tableA'作爲參數。 –

0

我給你X-Com的例子。 讓你的表格存儲數據以便運送到x-com基地。 讓表A商店招募,表B商品物品。 要顯示已被運到基地按日期排序新兵和物品的清單:

//soldiers 
    public class RowA 
    { 
     public long Id {get;set;} 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public DateTime Date { get; set; } 
    } 
    //items 
    public class RowB 
    { 
     public long Id {get;set;} 
     public string ItemName { get; set; } 
     public decimal Quantity { get; set; } 
     public DateTime Date { get; set; } 
    } 

    List<RowA> TableA; 
    List<RowB> TableB; 

    public Form1() 
    { 
     InitializeComponent(); 
     PrepareTestData(); 

     int uniqueId = 0; 
     var result = (from a in TableA 
         //Map soldiers to anonymous 
         select new 
         { 
          UniqueId = uniqueId++, 
          InnerId = a.Id, 
          Name = a.FirstName + " " + a.LastName, 
          Date = a.Date, 
         }) 
        .Union(from b in TableB 
          select new 
          { 
           UniqueId = uniqueId++, 
           InnerId = b.Id, 
           Name = b.ItemName, 
           Date = b.Date, 
          }).OrderByDescending(x => x.Date).ToList(); 
     dataGridView1.AutoGenerateColumns = true; 
     dataGridView1.DataSource = result; 

    } 

    void PrepareTestData() 
    { 
     TableA = new List<RowA>(); 
     for (int i = 0; i < 7; ++i) 
      TableA.Add(new RowA 
      { 
       Id = i + 1, 
       FirstName = "Name" + i, 
       LastName = "Surname" + i, 
       Date = DateTime.Now.AddDays(-i) 
      }); 
     TableB = new List<RowB>(); 
     for (int j = 0; j < 4; ++j) 
      TableB.Add(new RowB 
      { 
       Id = j + 1, 
       ItemName = "Laser pistol", 
       Quantity = 7, 
       Date = DateTime.Now.AddDays(-j) 
      }); 
    } 

您還可以創建輸出記錄類:

public Form1() 
    { 
     InitializeComponent(); 
     PrepareTestData(); 

     int uniqueId = 0; 
     var result = (from a in TableA 
         //Map soldiers to ShipmentReportItem 
         select new ShipmentReportItem 
         { 
          UniqueId = uniqueId++, 
          InnerId = a.Id, 
          Name = a.FirstName + " " + a.LastName, 
          Date = a.Date, 
         }) 
        .Union(from b in TableB 
          select new ShipmentReportItem 
          { 
           UniqueId = uniqueId++, 
           InnerId = b.Id, 
           Name = b.ItemName, 
           Date = b.Date, 
          }).OrderByDescending(x => x.Date).ToList(); 
     dataGridView1.AutoGenerateColumns = true; 
     dataGridView1.DataSource = result; 
    } 

一個結果類將是有益的ASP.NET gridview如果你需要一些檢查或記錄。然後,當你定義了類型時,你將可以輕鬆訪問數據源項目,否則你將不得不獲取數據項類型,然後檢查其屬性等,從特定屬性獲取值。

如果你的表B還存儲人(有相同的列),你不需要映射,因爲行結構將是相同的。

相關問題