2

以下を C# の LINQ to SQL ステートメントに変換しようとしています。誰か手を貸してくれませんか?基本的に、私のテーブルはすべての変更履歴の記録を保持しており、各シードロットの最大作成日が最新の記録であり、表示する正しい記録となります。

SELECT 
    reports.* 
FROM
    [dbo].[Reports] reports
WHERE
    reports.createdDate
IN (
    SELECT 
        MAX(report_max_dates.createdDate) 
    FROM 
        [dbo].[Reports] report_max_dates
    GROUP BY 
        report_max_dates.Lot
    )

これまでのところ、これは私が持っているものです。

var result = (from report in db.Reports
    where report.createdDate == (from report_max in db.Reports
                                group report_max by report_max.Lot into report_max_grouped
                                select report_max_grouped).Max()
    select report);

MAXすべてのレポートの日付を取得する方法とIN、report.createdDate でステートメントを実行する方法がわかりません。

編集

複数のレポートを含む別のタイトルがある場合、ステートメントをどのようにモデル化しますか。たとえば、l、m、n、x、y、z というレポートがあります。レポート lmn には外部キー reportList_Id を介してリンクされたタイトル「hello」があり、xyc には同じ方法でリンクされたタイトル「goodbye」があります。

基本的に、すべてのレポートを次のオブジェクトに取得する必要があります

public class ReportRoot : DbContext {
     public DbSet<ReportList> reportList {get;set;}
}

public class ReportList {
    public int Id {get;set;}
    public string status {get;set;}
    public List<ReportItem> {get;set;}
}

public class ReportItem {
    public int Id {get;set}
    public string title {get;set;}
    public List<Report> {get;set;}
}

public class Report {
    public int Id {get;set;}
    public string Lot {get;set;}
    public DateTime createdDate {get;set;}
}

私のクラスの完全なリストがあります。私がする必要があるのは、複数の reportItems (タイトル付きのレポートのリスト) を含む reportList を取得することです。したがって、これらの ReportItems にはレポート自体が含まれます。したがって、クエリの最初の部分で行ったように、max createdDate を使用してすべてのレポートを取得する必要がありますが、複数のレポートにタイトルがあるように ReportItems を含む ReportList オブジェクトとして取得する必要があります。

JSON をオブジェクトに適切にシリアライズおよびデシリアライズするには、上記の形式のオブジェクトが必要です。

これを思いついたので、それらを分離してタイトルを返しますが、タイトルを変更したレコードが両方のタイトルの下に表示されるなど、不要なレコードが返されます。

db.ReportLists.Select(rl => db.ReportItems
                      .Where(ri => ri.ReportListId == rl.Id)
                      .Select(ri => db.Reports
                              .Where(r => r.ReportItemId == ri.Id)
                              .GroupBy(r => r.seedLot)
                              .Select(g => g.OrderByDescending(x => x.createdDate).FirstOrDefault())))

ありがとう、Dman

4

2 に答える 2

2
var recentDates = Reports
    .GroupBy(r=>r.SeedLot, r=>r.CreatedDate)
    .Select(rg=>rg.Max());

var result =
    from r in Reports
    join d in recentDates
        on r.createdDate equals d
    select r;
于 2012-09-06T15:35:42.743 に答える
1

よく理解できていないかもしれませんが、基本的には、個別の Lot ごとに最後に作成された日付が必要ですか? はいの場合

db.Reports
  .GroupBy(r => r.Lot)
  .Select(g => g.OrderByDescending(x => x.createdDate).FirstOrDefault());

またはあなたのようにする(しかし、それが最も簡単な方法かどうかはわかりません)

var maxDates = Reports.GroupBy(r => r.Lot)
            .Select(x => x.Max(g => g.createdDate).ToList();

var result = db.Reports.Where (m => maxDates.Contains(m.createdDate));

編集

あなたの例はそれほど明確ではありません(わかりやすくするために名前を少し変更しています)。

最初にコードを使用すると、そのようなものが必要になります(アイデアは同じです)

クラスレポート

public class Report {
   public int Id {get;set;}
   public int Lot {get;set;}
   public Datetime CreatedDate {get;set;}
   public virtual Category Category {get;set;} //Navigation property
}

クラスのカテゴリ

public class Category {
    public int Id {get;set;}
    public string Title {get;set;}
    public virtual IList<Report> ReportList {get;set;} //Navigation property
}

そして最終的には「結果クラス」

public class ReportList {
    public string Title {get;set;}
    public List<Report> ReportList {get;set;}
}

その後、クエリは次のようになります

db.Reports
  .GroupBy(r => r.Lot)
  .Select(g => g.OrderByDescending(x =x.createdDate).FirstOrDefault())
  .GroupBy(m => m.Category.Id)
  .Select(g => new  ReportList {
    Title = g.FirstOrDefault().Category.Title,
    ReportList = g.OrderBy(x => x.Lot)
  });
于 2012-09-06T15:41:28.160 に答える