A と B の 2 つのテーブルがあり、これらは完全に独立していますが、どちらtime
にもタイプの列がありますDateTime
。
time
1 つのコレクションで両方のテーブルから(フィールドに基づいて) 最新の 10 件のレコードを取得するには、どのような単純な LINQ クエリを作成する必要がありますか? たとえば、このクエリは、A の 7 つのレコードと B の 3 つのレコード - 合計で 10 のレコードを返す場合があります。
var _result = tableA
.Select(x => x.time)
.Union(tableB.Select(y => y.time))
.OrderByDescending(z => z.time)
.Take(10);
ソース
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;
}
レコードのチェックまたは変更が必要な場合、1 つの結果クラスが ASP.NET グリッドビューに役立ちます。次に、タイプを定義したときにデータソースアイテムに簡単にアクセスできます。そうでない場合は、データアイテムタイプを取得してから、そのプロパティを確認し、特定のプロパティから値を取得する必要があります。
また、テーブル B にも人 (同じ列がある) が格納されている場合は、行構造体が同じになるため、マッピングは必要ありません。