1

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

1 に答える 1

1

あなたの場合、私は個人的な経験である種のコンバーターを使おうとします。私はこのプログラムhttp://sqltolinq.com/を使用しました。これは、SQLからlinqへの変換で非常にうまく機能することがよくあります。

于 2012-04-04T01:36:06.717 に答える