2011-10-03 2 views
2

У меня есть серия выпадающих списков, которые каскадом, но вместо исключений списка исключаются из списка в соответствии с выбором пользователя, не связанные с ним параметры в списке отключены. Они все еще присутствуют в выпадающем списке, но они неактивны, пользователь не может выбрать их, и они не будут включены в submit.Каскадные списки выпадающих списков с выражением Лямбда в 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] 

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

Спасибо!

ответ

0

Вам действительно не нужен 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) 
} 
+0

Магнус, ваша версия лучше! Благодаря! – Kuyenda

+0

HasValue не работает с OptionA_ID, который является типом INT. – Kuyenda

+0

Поскольку вы выполняете левое соединение, вам, вероятно, нужна проверка, если x не является нулевым – Magnus

0

Я считаю, что понял.

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 } 

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

 Смежные вопросы

  • Нет связанных вопросов^_^