2011-10-03 90 views
2

我有一系列級聯下拉列表,但根據用戶的選擇而不是從列表中排除列表選項,列表中的無關選項將被禁用。它們仍然存在於下拉列表中,但它們變灰,用戶不能選擇它們,它們將不會包含在提交中。在LINQ中使用Lambda表達式級聯下拉列表

我通過列表選項和適用於用戶當前選擇的列表選項的子集之間的左連接完成此操作。如果子列表中缺少主列表的成員,那麼將返回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不適用於INT類型的OptionA_ID。 – 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 } 

希望這會幫助別人。