[英]What is the best way to convert this SQL query to Linq?
我要实现的目标是这个。 SiteList
表中的每条记录都与SiteList
表中的SiteList
与最新记录结合ReportCreateDate
。 这应该很简单,但我一直空白。 我该怎么做呢?
样本数据模块
网站清单
SiteID SiteName MiscData
------------------------------------
1 Albany New York
2 Boston Massachusetts
3 Concord New Hampshire
报告书
ReportID SiteID ReportCreateDate Report Data
-------------------------------------------------------
1 1 1/1/14 10:01 AM alpha
2 2 1/1/14 10:02 AM beta
3 3 1/1/14 10:03 AM charlie
4 3 1/2/14 10:01 AM charlie
5 1 1/2/14 10:02 AM alpha
6 2 1/2/14 10:03 AM beta
7 2 1/5/14 10:01 AM beta
8 3 1/5/14 10:02 AM charlie
9 1 1/5/14 10:03 AM alpha
这是一个有效的SQL查询:
select
sl.siteid,
max(rr.reportcreatedate),
rr.reprtdata
from sitelist sl, reports rr
where sl.siteid=rr.siteid
group by sl.siteid,sl.sitename,rr.reportdata
产生这个:
SITEID SITENAME MAX REPORTDATA
------------------------------------------------------
1 New York 1/5/2014 10:03:00 PM alpha
2 Massachusetts 1/5/2014 10:01:00 AM beta
3 New Hampshire 1/5/2014 10:02:00 AM charlie
现在,我需要一个Linq查询来执行相同的操作。 这是我到目前为止的内容:
var results =
(from sl in fDataModule.DataAdapter.GetTable<SITELIST>()
join r in fDataModule.DataAdapter.GetTable<REPORTS>()
on sl.SITEID equals r.SITEID
group new { sl, r } by new { sl.SITEID, r.REPORTCREATEDATE, r.REPORTDATA } into rg
select new
{
siteid = rg.Key.SITEID,
rdata = rg.Key.REPORTDATA,
//rdate = rg.OrderByDescending(x => x.r.REPORTCREATEDATE).FirstOrDefault()
rdate = rg.Key.REPORTCREATEDATE
})
我试图使用orderby
来选择Reports表中的最新记录,但它不返回任何记录。 有什么想法我想念的吗?
我编写了一个控制台应用程序,以向您解释您想要什么。
最初,我声明了以下类:
public class SiteList
{
public int SiteId { get; set; }
public string SiteName { get; set; }
public string MiscData { get; set; }
}
和
public class Report
{
public int ReportId { get; set; }
public int SiteId { get; set; }
public DateTime ReportCreateDate { get; set; }
public string ReportData { get; set; }
}
然后程序类包含主要逻辑
public class Program
{
static void Main(string[] args)
{
// Create a list of sites.
List<SiteList> sitesList = new List<SiteList>()
{
new SiteList() { SiteId=1, SiteName="Albany", MiscData="New York"},
new SiteList() { SiteId=2, SiteName="Boston", MiscData="Massachusetts"},
new SiteList() { SiteId=3, SiteName="Concord", MiscData="New Hampshire"}
};
// Create a list of reports.
List<Report> reports = new List<Report>()
{
new Report(){ ReportId=1, SiteId=1, ReportCreateDate = DateTime.Parse("1/1/14 10:01 AM"), ReportData="alpha"},
new Report(){ ReportId=2, SiteId=2, ReportCreateDate = DateTime.Parse("1/1/14 10:02 AM"), ReportData="beta"},
new Report(){ ReportId=3, SiteId=3, ReportCreateDate = DateTime.Parse("1/1/14 10:03 AM"), ReportData="charlie"},
new Report(){ ReportId=4, SiteId=3, ReportCreateDate = DateTime.Parse("1/2/14 10:01 AM"), ReportData="charlie"},
new Report(){ ReportId=5, SiteId=1, ReportCreateDate = DateTime.Parse("1/2/14 10:02 AM"), ReportData="alpha"},
new Report(){ ReportId=6, SiteId=2, ReportCreateDate = DateTime.Parse("1/2/14 10:03 AM"), ReportData="beta"},
new Report(){ ReportId=7, SiteId=2, ReportCreateDate = DateTime.Parse("1/5/14 10:01 AM"), ReportData="beta"},
new Report(){ ReportId=8, SiteId=3, ReportCreateDate = DateTime.Parse("1/5/14 10:02 AM"), ReportData="charlie"},
new Report(){ ReportId=9, SiteId=1, ReportCreateDate = DateTime.Parse("1/5/14 10:03 AM"), ReportData="alpha "}
};
// Here is the query you want
var results = (from r in reports
group r by r.SiteId into g
join s in sitesList
on g.Key equals s.SiteId
select new
{
SiteId=s.SiteId,
SiteName = s.MiscData,
Date = g.Max(x=>x.ReportCreateDate),
ReportData = g.Select(x=>x.ReportData).First()
}).ToList();
Console.ReadKey();
}
}
注意在您的情况下, fDataModule.DataAdapter.GetTable<SITELIST>()
是我上面使用的siteList
,而fDataModule.DataAdapter.GetTable()是我们的reports
。 另外,您还必须注意我使用的一些其他变量。 例如,您使用SiteID,而我使用SiteId。 如果进行此更改,则查询将产生所需的结果。
这是.net Fiddle,您可以在其中看到提供的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.