2011-10-03 21 views
2

一連のドロップダウンリストがカスケード表示されていますが、ユーザーの選択に応じてリストオプションから除外されるリストオプションの代わりに、それらはまだドロップダウンリストに存在していますが、グレー表示されているため、ユーザーは選択できず、送信には含まれません。LINQでラムダ式を使用したドロップダウンリストの一覧表示

これは、リストオプションと、ユーザーの現在の選択に適用可能なリストオプションのサブセットの間で左結合を使用して行います。メインリストのメンバーがサブセットにない場合、nullが返され、そのオプションが無効になるかどうかを示すbooleanを提供することができます。

3つのカスケードドロップダウンリストがOptionA、OptionB、OptionCの3つのテーブルに関連付けられているとします。 vwOptionIndexは、現在使用されているOptionA、OptionBおよびOptionCのすべての組み合わせを索引付けし、カスケードに適用可能なサブセットを提供するビューです。

OptionB(123,456)の2つの値とOptionC(789)の1つの値を選択した場合、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

Magnus、あなたのバージョンが優れています!ありがとう! – Kuyenda

+0

HasValueは、タイプINTのOptionA_IDで動作しません。 – Kuyenda

+0

左結合を行っているので、おそらくxがnullでないかどうかのチェックが必要です – 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 } 

これが他の人に役立つことを望みます。

関連する問題