将SQL语句转换为Linq

时间:2012-09-06 15:23:24

标签: c# sql linq

我正在尝试将以下内容转换为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日期以及如何在report.createdDate上执行IN语句。

修改

如何立即对声明进行建模如果我有一个包含多个报告的单独标题。例如,我有报告l,m,n,x,y,z。报告l m n通过外键reportList_Id链接到它们的标题“hello”,x y c以相同的方式链接标题“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返回所有报告,就像我们对查询的第一部分所做的那样,但我需要将它们作为ReportList对象返回,这些对象包含ReportItems,以便多个报告具有其标题。

我需要上述格式的对象才能将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())))

Thansk, DMAN

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)
  });