0

複数の条件を使用して左結合を使用して LINQ でテーブルをリンクすることに関する他の質問を熟読し、関連する例と思われるものを試しましたが、必要な結果を得るために C# LINQ コードを作成できません。

私は2つのテーブルを持っています。1 つ目は ProductionOptions で、2 つ目は ProductionOrderDetailsOptions です。

これは、ProductionOptions テーブルの内容です (簡潔にするために、optionType でフィルタリングされています)。

optionType  optionValue            order     showTextBox
----------------------------------------------------------
PACKAGING   BLACK BOX                   8   False
PACKAGING   CUSTOM FOLDING WITH LOGO    4   True
PACKAGING   FLANNEL DUST BAG            6   False
PACKAGING   FOLDING                     2   False
PACKAGING   IMAGE FOLDING               1   False
PACKAGING   NAVY BOX                    9   False
PACKAGING   OTHER                      13   True
PACKAGING   PLAIN FOLDING               3   False
PACKAGING   POLYBAG                     5   False
PACKAGING   SET UP BOX BLACK           11   True
PACKAGING   SET UP BOX CREAM           10   True
PACKAGING   SET UP BOX NAVY            12   True
PACKAGING   SHRINK WRAP                 7   False

これは、ProductionOrderDetailsOptions テーブルです。

orderNo detailKey   optionType  optionValue                 optionAdditionalInfo
---------------------------------------------------------------------------
000001  1           PACKAGING   IMAGE FOLDING   
000001  1           PACKAGING   POLYBAG NULL
000001  1           PACKAGING   SET UP BOX BLACK            needs white lettering
000007  4           PACKAGING   CUSTOM FOLDING WITH LOGO    BMW

ここで、ProductionOrderDetailsOptions テーブルに左結合したときに、ProductionOptions テーブルのすべての行を表示したいと考えています。

必要な LINQ に相当する SQL は次のとおりです。

SELECT *
FROM ProductionOptions po
LEFT JOIN ProductionOrderDetailsOptions o on po.optionType = o.optionType
AND po.optionValue = o.optionValue
AND o.orderNo = '000001'
AND o.detailKey = 1
WHERE po.optionType = 'PACKAGING'

ここに私が望む結果があります: 望ましい出力

表向きは、LINQ の結果を GridView のようなオブジェクトにバインドしたいと考えています。

ここまでくれば、よろしくお願いします…。

4

2 に答える 2

0

FK リレーションがある場合は、次のようになります。

var items = ProductionOptions
.Where(p => p.ProductionOrderDetailsOptions == null || p.ProductionOrderDetailsOptions.optionType.Equals(p.optionType))
.Where(p => p.ProductionOrderDetailsOptions == null ||p.ProductionOrderDetailsOptions.optionValue.Equals(p.optionValue))
.Where(p => p.ProductionOrderDetailsOptions == null ||p.ProductionOrderDetailsOptions.orderNo.Equals("000001"))
.Where(p => p.ProductionOrderDetailsOptions == null ||p.ProductionOrderDetailsOptions.detailKey.Equals(1))
.Where(p => p.optionType.Equals("PACKAGING"))
.AsEnumerable();

foreach(var item in result)
{
   //ProductionOptions
   Console.WriteLine(item.optionType);
   //ProductionOrderDetailsOptions
   Console.WriteLine(item.ProductionOrderDetailsOptions.detailKey);
}
于 2013-07-25T18:26:33.270 に答える