2

我有一系列级联的下拉列表,但不是根据用户的选择从列表中排除列表选项,而是禁用列表中不相关的选项。它们仍然存在于下拉列表中,但它们是灰色的,用户无法选择它们并且它们不会包含在提交中。

我通过列表选项和适用于用户当前选择的列表选项子集之间的左连接来完成此操作。如果子集中缺少主列表的成员,则将返回 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]

任何帮助将不胜感激。

谢谢!

4

2 回答 2

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)
}
于 2011-10-04T21:19:28.930 回答
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 }

希望这会帮助其他人。

于 2011-10-04T21:39:14.877 回答