Каскадные выпадающие списки с лямбда-выражением в LINQ - PullRequest
2 голосов
/ 03 октября 2011

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

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

Предположим, у меня есть три каскадных выпадающих списка, привязанных к следующим трем таблицам: 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]

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 октября 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 }

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

0 голосов
/ 05 октября 2011

На самом деле вам не нужно 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)
}
...