我刚刚开始了一个使用 Linq To SQL 的项目(原因有很多,但目前,这就是正在使用的,而不是 EF 或 ANOther ORM)。我的任务是迁移旧的(我在这里说的是 VB6)遗留代码。我主要来自 T-SQL 背景,所以我敲了一个查询,可以做我想做的事,但我必须使用 LINQ to SQL (c# 3.5),我没有太多经验。请注意,数据库将是 SQL Server 2008 R2 和/或 SQL Azure
这是 T-SQL(简化)
SELECT TBS.ServiceAvailID, sum(Places) as TakenPlaces,MAX(SA.TakenPlaces)
FROM TourBookService TBS
JOIN TourBooking TB
ON TB.TourBookID=TBS.TourBookID
JOIN ServiceAvail SA
ON TBS.ServiceAvailID = SA.ServiceAvailID
WHERE TB.Status = 10
AND ServiceSvrCode='test'
GROUP BY TBS.ServiceAvailID
HAVING sum(Places) <> MAX(SA.TakenPlaces)
因此,有一个 TourBooking 表,其中包含客户预订的详细信息。这挂在 TourBookService 表上,该表包含他们预订的服务的详细信息。还有一个链接到 TourBookService 表的 ServiceAvail 表。现在, Places 的总和应该等于 ServiceAvail 表中的 Taken places 数量,但有时情况并非如此。如果不是这种情况,此查询会返回任何内容。我可以创建 Linq 来获取 sum(places) 详细信息,但我正在努力获取获取 TakenPlaces 的语法(请注意,这也不包括该HAVING
子句)
var q = from tbs in TourBookServices
join tb in TourBookings on tbs.TourBookID equals tb.TourBookID
join sa in ServiceAvails on tbs.ServiceAvailID equals sa.ServiceAvailID
where (tb.Status == 10)
&& ( tbs.ServiceSvrCode =="test")
group tbs by tbs.ServiceAvailID
into g
select new {g.Key, TotalPlaces = g.Sum(p => p.Places)};
我需要以某种方式将 sa 表放入组中,以便我可以添加g.Max(p=>p.PlacesTaken)
到选择中。
我是否试图强迫 T-SQL 思考 LINQ ?我可以有另一个查询,从 ServiceAvail 表中获取所有适当的详细信息,然后遍历两个结果集并匹配键,这很容易做到,但感觉不对(但这可能只是我!)任何评论将不胜感激。
更新: 根据下面接受的答案,这是 Linqer 给我的。我会玩一玩,看看它实际创建了什么 SQL。
from tbs in db.TourBookService
join sa in db.ServiceAvail on tbs.ServiceAvailID equals sa.ServiceAvailID
where
tbs.TourBooking.Status == 10
tbs.ServiceSvrCode == "test")
group new {tbs, sa} by new {
tbs.ServiceAvailID
} into g
where g.Sum(p => p.tbs.Places) != g.Max(p => p.sa.TakenPlaces)
select new {
ServiceAvailID = (System.Int32?)g.Key.ServiceAvailID,
TakenPlaces = (System.Int32?)g.Sum(p => p.tbs.Places),
Column1 = (System.Int32?)g.Max(p => p.sa.TakenPlaces)
}