2012-04-04 6 views
1

私はLinq To SQLを使用するプロジェクトを開始したばかりです(この理由はさまざまですが、 EFまたは他のORMではない)。 私は以前の(そして私はここでVB6で話している)古いコードを移行することを任されています。 私は主にT-SQLのバックグラウンドから来たので、私が望むことをするクエリをノックしましたが、LINQ to SQL(C#3.5)を使用する必要があります。データベースがSQL Server 2008 R2および/またはSQL AzureのここLinq出力で複数のテーブル列を持つSQL同等のグループ

なること 注意が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の合計は、Taken場所の金額とServiceAvailテーブルの金額が同じになるはずですが、時にはそうではありません。このクエリは、これが当てはまらない場合には何かを返します。私は合計(場所)の詳細を取得するためのLINQを作成することができますが、私はまたTakenPlacesが

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

私は必要があります(これはどちらかHAVING句が含まれていないことに注意)を取得する構文を取得するために苦労しています何とかsaテーブルをグループに入れ、selectにを追加することができます。

T-SQLの考え方をLINQに強制しようとしていますか? 私はServiceAvailテーブルからすべての適切な詳細を取得した後、両方の結果セットをループし、簡単に実行できるキーに一致する別のクエリを作成できますが、間違っていると感じます(しかし、それは私だけかもしれません)。 どんなコメントも感謝します。


UPDATE:以下受け入れ答えを1として 、これは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) 
} 
+0

あなたは大まかで大量のようなマイクロオーミックを使用できますか?それはあなたが変換するのはかなり簡単です。 –

+0

残念なことに私の手はLinqとSQLのあいだで – PabloInNZ

答えて

1

私はそれは多くの場合、LINQにSQLをconvertitngで非常にうまく機能http://sqltolinq.com/このプログラムを使用し、私の個人的な経験では、コンバータのいくつかの種類を使用しようとするだろう。

+0

Ahaと結ばれています。私はそれを見逃していないだろう。私にはlinqのアイデアを得て、それがどのようなSQLを生成するのかを知るには良い場所です。私はそれがコメントに収まらないので、別の答えで出力を追加します。どうもありがとう – PabloInNZ

関連する問題