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())))

谢谢,德曼

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

我可能不明白,但基本上,您想要每个不同批次的最后创建日期?如果是,那么

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 回答