LinqTo在输出中包含多个表列的SQL等效组
本文关键字:SQL 输出 包含多 LinqTo | 更新日期: 2023-09-27 18:29:51
我刚刚开始一个使用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表上,表上有他们预订的服务的详细信息。还有一个ServiceAvail表,它链接到TourBookService表。现在,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)
添加到select中。
我是否试图将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)
}
在您的情况下,根据我的个人经验,我会尝试使用某种转换器,我使用了这个程序http://sqltolinq.com/它通常能很好地将sql转换为linq。