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

LinqTo在输出中包含多个表列的SQL等效组

在您的情况下,根据我的个人经验,我会尝试使用某种转换器,我使用了这个程序http://sqltolinq.com/它通常能很好地将sql转换为linq。