0

A と B の 2 つのテーブルがあり、これらは完全に独立していますが、どちらtimeにもタイプの列がありますDateTime

time1 つのコレクションで両方のテーブルから(フィールドに基づいて) 最新の 10 件のレコードを取得するには、どのような単純な LINQ クエリを作成する必要がありますか? たとえば、このクエリは、A の 7 つのレコードと B の 3 つのレコード - 合計で 10 のレコードを返す場合があります。

4

2 に答える 2

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

ソース

于 2012-12-07T09:02:50.167 に答える
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;
    }

レコードのチェックまたは変更が必要な場合、1 つの結果クラスが ASP.NET グリッドビューに役立ちます。次に、タイプを定義したときにデータソースアイテムに簡単にアクセスできます。そうでない場合は、データアイテムタイプを取得してから、そのプロパティを確認し、特定のプロパティから値を取得する必要があります。

また、テーブル B にも人 (同じ列がある) が格納されている場合は、行構造体が同じになるため、マッピングは必要ありません。

于 2012-12-07T11:02:06.040 に答える