Каскадные раскрывающиеся списки с лямбда-выражением в LINQ

У меня есть несколько каскадных раскрывающихся списков, но вместо того, чтобы параметры списка были исключены из списка в соответствии с выбором пользователя, несвязанные параметры в списке отключены. Они все еще присутствуют в раскрывающемся списке, но выделены серым цветом, пользователь не может их выбрать, и они не будут включены в отправку.

Я добиваюсь этого с помощью левого соединения между параметрами списка и подмножеством параметров списка, которые применимы к текущему выбору пользователя. Если член основного списка отсутствует в подмножестве, он вернет null, и я могу указать это, чтобы предоставить логическое значение, которое указывает, будет ли отключена эта опция.

Предположим, у меня есть три каскадных раскрывающихся списка, привязанных к следующим трем таблицам: OptionA, OptionB и OptionC. vwOptionIndex - это представление, которое индексирует все комбинации OptionA, OptionB и OptionC, которые используются в настоящее время, тем самым обеспечивая применимое подмножество для каскадирования.

Если пользователь выбирает два значения в OptionB (123, 456) и одно значение в OptionC (789), то для возврата списка для OptionA я бы использовал следующий запрос SQL Server.

SELECT
    a.ID,
    a.Label,
    CAST(
        CASE
            WHEN SUM(
                CASE
                    WHEN x.OptionA_ID IS NULL
                    THEN 0
                    ELSE 1
                END
            ) > 0
            THEN 0
            ELSE 1
        END AS BIT
    ) AS [Disabled]
FROM dbo.OptionA AS a
LEFT OUTER JOIN dbo.vwOptionIndex AS x
ON a.ID = x.OptionA_ID
AND OptionB_ID IN (123, 456)
AND OptionC_ID IN (789)
GROUP BY a.ID, a.Label

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

from t1 in OptionAs
join t2 in VwOptionIndex
on new { t1.ID} equals new { t2.OptionA_ID } into j1
from j2 in j1.DefaultIfEmpty()
group j2 by new { t1.ID, t1.Label } into g
select new { g.Key.ID, g.Key.Label, Disabled = <???> }

Другими словами, мне нужна следующая логика в приведенном выше выражении запроса LINQ.

CAST( CASE WHEN SUM( CASE WHEN x.OptionA_ID IS NULL THEN 0 ELSE 1 END ) > 0 THEN 0 ELSE 1 END AS BIT ) AS [Disabled]

Любая помощь будет принята с благодарностью.

Спасибо!


person Kuyenda    schedule 03.10.2011    source источник


Ответы (2)


На самом деле вам не нужен Sum, вам нужно только проверить, есть ли в группе какие-либо значения, которые не равны нулю.

from t1 in OptionAs
join t2 in VwOptionIndex
on new { t1.ID} equals new { t2.OptionA_ID } into t3
from t2 in t3.DefaultIfEmpty()
group t1 by new { t1.ID, t1.Label } into g
select new 
{ 
   g.Key.ID, 
   g.Key.Label, 
   Disabled = g.Any (x => x.OptionA_ID.HasValue)
}
person Magnus    schedule 04.10.2011
comment
Магнус, твоя версия лучше! Спасибо! - person Kuyenda; 05.10.2011
comment
Поскольку вы выполняете левое соединение, вам, вероятно, понадобится проверка, не является ли x не равным нулю - person Magnus; 05.10.2011

Думаю, я понял это.

from t1 in OptionAs
join t2 in VwOptionIndex
on new { t1.ID} equals new { t2.OptionA_ID } into j1
from j2 in j1.DefaultIfEmpty()
group j2 by new { t1.ID, t1.Label } into g
select new { g.Key.ID, g.Key.Label, Disabled = g.Count( t => t.ID == null) > 0 }

Надеюсь, это поможет кому-то другому.

person Kuyenda    schedule 04.10.2011