2011-01-03 30 views
0

私はしばらくこの問題に取り組んできましたが、私は仕事をするための実例を見つけることができませんので、私は専門家にうまく向いています。助けを求めて事前に感謝します。SQLを左に変換するJOINをLinqに変換

私はLinqに変換する必要がある動作中のSQLクエリを持っています。最初は、リスト内のアイテムの日々のランキングを示したMSChart(折れ線グラフ)を駆動する簡単なlinqクエリがありました。残念ながら、MSChartは、チャートからNull値で日付を削除しませんが、Null以外の値で翌日に接続するだけなので、nullを0に置き換える必要があります。

次のクエリでは、テーブルに対するLeft、Self Joinを使用してこれを実行します。ここでは、別の日のリスト(すべての日を含む)を取得します。私は、すべての日の一覧を含む付帯テーブルを設定することもできることを知っていますが、これはすべてのケースで同様に効果的でなければなりません。特定の書籍/リストの組み合わせについてSSMSで完璧な作品を以下のSQL:

select L2.date, ISNULL(L1.ranking,0) 
from (select distinct date from ListItem where ListID = 1) L2 
Left join ListItem L1 on L2.date = L1.date and L1.BookID = 1 and L1.ListID = 1 
order by date 

これは何の順位が存在しない任意の日付の0ランク付けして、すべての日付とランキングのリストを返します。チャートをこれに結びつけるために、私はLinqへの変換が最良のコースだと信じています。

私はこれまでのところ私の試みを掲示するだろうが、彼らはひどく間違っていることを恐れている。それ以上の情報が必要な場合は、私に知らせてください。

ありがとうございました。

-ダン

答えて

1

このようなものはありますか?

var distinctDates = 
    ListItems 
     .Where(li => li.ListId == 1) 
     .Select(li => li.date) 
     .Distinct(); 

var list1 = 
    ListItems 
     .Where(li => li.BookID == 1 && li.ListID == 1); 

var results = 
    distinctDates 
     .Join(
      list1, 
      d => d, 
      li1 => li1.date, 
      (d, li1) => new{ date = d, ranking = li1.ranking ?? 0 } 
     ) 
     .OrderBy(x => x.date); 

(第一回転以来、いくつかの変更を加えました。)

+0

これは私が「ランキング= li1.ranking ?? 0」に参加の最後の行にエラーを取得してい除き、非常に近くに見えます。 "演算子" ?? "は、 'int'型または 'int型'のオペランドには適用できません。 – nycdan

+0

これは、" ranking = li1.ranking "の前に(int? 0 "に設定されていますが、前回と同じセットが返されます。ヌル日付はセットから抜けていますが、悪くはありませんが、それでも構いませんので、近いと思われます。 – nycdan

+0

、私はついにこれを得たことに気付きました。 – nycdan