2012-04-02 21 views
0

とCASE文の私はトラブルLINQで(私が望む結果を返します)、以下のSQLを表現しようとしているが生じています:LINQは - サブクエリ

select 
    case r.CategoryID 
    when 2 then 
     case r.PrimaryRecord 
      when 1 then r.RecordID 
      else (select RecordID from Record where RecordGroupID = r.RecordGroupID and PrimaryRecord = 1) 
     end 
    else 
     r.RecordID 
    end 
    as RecordID 
    , r.FooID 
from Record r 
where 
    r.FooID = 3 

各行レコードテーブルでは、一意のレコードIDを持っています。複数のRecordIDをCategoryID 2のRecordGroupIDに関連付けることができますが、そのうちの1つのみがPrimaryRecordフィールドの値が1になります。

次の表に示すデータがあれば、私の希望する出力はRecordID = 1、FooID = 3 PrimaryRecordであるが指定された行のFooIDがWhere句に一致するRecordGroupIDのRecordID。

RecordID RecordGroupID PrimaryRecord CategoryID FooID 
1   1    1    2    1 
2   1    0    2    1 
3   1    0    2    3 

SQL自体はおそらく世界で最も効率的なSQLではありませんが、私が思いつくのは最高でした。

誰かがこのクエリを表すためにLINQ文を作成するのを助けてくれれば幸いです。

+0

't.PrimaryRecord'とは何ですか? 't'はどこでもあなたのクエリに定義されていません。 – Yuck

+0

@Yuck - 謝罪は、タイプミスでした。今修正されました。 –

+0

@Yuck - あなたが掲示して削除した答えに感謝したいと思います。私はSQLを書き直しましたが、オプションがなければ、どのように実行されたかを見るのは非常に便利でした。 –

答えて

2

私はあなたが本当に元のクエリで大文字小文字を必要としないと思う。

var matchingRecords = from r in Records 
         where r.FooId = fooId && r.CategoryId == catId && r.RecordGroupId == groupId 
         join r2 in Records on r.RecordGroupId == r2.RecordGroupId && r.CategoryId == r2.CategoryId && r2.PrimaryRecord 
         select r2; 

編集:のようなものを試してみてくださいRecordGroupIdは、カテゴリ内の唯一のユニークであると仮定すると、参加にCategoryIdを追加しました。

+0

ありがとう!面倒なことに、私はあなたのLINQステートメントが行うことをほとんど行うためにSQLクエリを書き直す方法を知りました。クエリーは、最初は正しいとは思っていませんでしたが、12ヶ月以上は書かれていませんでした。 –

関連する問題