2012-04-02 181 views
0

我有麻煩試圖代表SQL以下(返回的結果我想)在LINQ CASE語句:LINQ到SQL - 與子查詢

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 

在記錄表的每一行都有一個唯一的recordId。多個RecordID可能與CategoryID 2的RecordGroupID關聯,但其中只有一個PrimaryRecord字段值爲1.

給定下面的數據表,我所需的輸出是RecordID = 1,FooID = 3,即給定RecordGroupID的RecordID是PrimaryRecord,但是匹配我的Where子句的給定行的FooID。

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

我很欣賞SQL本身可能不是世界上最高效的SQL,但它是我能想到的最好的SQL。

如果任何人都可以幫助我創建LINQ語句來表示這個查詢,那就太棒了。

+0

什麼是't.PrimaryRecord'?您的查詢中沒有在任何地方定義't'。 – Yuck 2012-04-02 13:14:29

+0

@Yuck - 道歉,是一個錯字。現在修復。 – 2012-04-02 13:18:53

+0

@Yuck - 只是想說謝謝你發佈和刪除的答案。儘管我重寫了SQL,但是如果我沒有選擇,那麼看看它是如何完成的,這是非常有用的。 – 2012-04-02 13:40:34

回答

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; 

編輯:加入加入CategoryId,假設RecordGroupId只有一個類別裏面是唯一的。

+0

謝謝!有趣的是,我只是想出瞭如何重寫我的SQL查詢來完成你的LINQ語句。該查詢並不真正感覺正確,但是在12個月以上沒有寫入。 – 2012-04-02 13:34:14