2012-12-07 4 views
0

두 개의 테이블 A와 B는 완전히 독립적이지만 모두 time 열을 가지고 있습니다.이 열은 DateTime입니다.LINQ - 두 테이블에서 n 개의 레코드를 가져 오는 방법은 무엇입니까?

하나의 컬렉션에서 두 테이블의 가장 최근 10 개 레코드 (time 필드 기반)를 얻으려면 어떤 간단한 LINQ 쿼리를 작성해야합니까? 예를 들어이 쿼리는 A 레코드 7 개 레코드와 B - 10 레코드 레코드 3 개를 모두 반환 할 수 있습니다.

+0

테이블 A의 테이블 B에 가입해야합니다.이 페이지를보십시오 : http://www.dotnetperls.com/join. LINQ로 조인을 수행하는 방법을 설명합니다. – Carsten

+0

테이블 A와 B에 "시간"열과 같은 다른 열이 있습니까? 얻으려는 쿼리에 대한 출력 레코드를 지정하지 않았기 때문입니다. 두 테이블이 완전히 다른 경우 익명 출력 레코드를 만들 수 있습니다. A와 B가 같은 열을 가지고 있다면 Union을 할 수 있습니다. – 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

방법이 'VAR의 _result = TABLEA \t \t \t .Union (TableB의) \t \t \t .OrderByDescending (Z => z.time) \t \t \t .Take (10)에 대해,'? –

+0

'Union'은'tableA'을 인수로 기대하기 때문에 작동하지 않습니다. –

0

나는 당신에게 X-컴 예를 들어주지. 테이블에 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 일부 검사 또는 modyfing 레코드가 필요한 경우. 그런 다음 유형을 정의 할 때 데이터 소스 항목에 쉽게 액세스 할 수 있습니다. 그렇지 않으면 데이터 항목 유형을 가져와 속성 등을 확인해야합니다. 특정 속성에서 값을 가져옵니다.

테이블 B가 사람 (같은 열을 가짐)을 저장하면 행 구조체가 동일하므로 매핑이 필요하지 않습니다.

관련 문제