LINQ to SQL - оператор CASE с подзапросом - PullRequest
0 голосов
/ 02 апреля 2012

У меня возникли проблемы при попытке представить приведенный ниже 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

Каждая строка в таблице записей имеет уникальный идентификатор записи. Несколько RecordID могут быть связаны с RecordGroupID для CategoryID 2, но только один из них будет иметь значение поля PrimaryRecord, равное 1.

Учитывая приведенную ниже таблицу данных, мой желаемый вывод: RecordID = 1, FooID = 3, т.е. RecordID для данного RecordGroupID, который является PrimaryRecord, но FooID для данной строки, которая соответствует моему предложению Where.

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

Я ценю, что сам SQL, вероятно, не самый эффективный SQL в мире, но он был лучшим, что я мог придумать.

Если бы кто-нибудь мог помочь мне создать оператор LINQ для представления этого запроса, было бы замечательно.

1 Ответ

2 голосов
/ 02 апреля 2012

Я думаю, вам не нужен регистр в исходном запросе.Попробуйте что-то вроде:

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 уникально только внутри категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...