Linq To SQLを使用するプロジェクトを開始したばかりです(これにはさまざまな理由がありますが、現時点では、EFやANOther ORMではなく、それが使用されています)。私は古い(そしてここではVB6について話している)レガシーコードを移行する任務を負っています。私は主にT-SQLのバックグラウンドを持っているので、やりたいことを実行するクエリをノックアップしましたが、あまり経験のないLINQ to SQL(c#3.5)を使用する必要があります。データベースはSQLServer2008R2および/またはSQLAzureになることに注意してください
これが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を作成することはできますが、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)
}