web-dev-qa-db-ja.com

linq caseステートメント

Linq(c#)のCASEステートメントに関するヘルプが必要です。

osc_products.products_quantity =
      CASE 
         WHEN itempromoflag <> 'N' THEN 100000
         WHEN itemcat1 IN ('1','2','31') AND itemsalestatus = 'S' THEN 100000
         WHEN itemsalestatus = 'O' THEN 0
         ELSE cds_oeinvitem.itemqtyonhand - cds_oeinvitem.itemqtycommitted 
      END  

Linqに変換することから始めました(まだ学んでいます):

cdsDBDataContext db = new cdsDBDataContext();
  var query = from items in db.cdsItems
              where items.ItemHandHeldFlag.Equals("Y") && 
              items.ItemQtyOnHand -  items.ItemQtyCommitted > 0
  select items;

このクエリは、在庫ステータスを生産から商業サイトに更新します。

44
Scott Kramer

[〜#〜] case [〜#〜]ステートメントが[〜#〜] linq [〜#〜] your after(コメントを読む)の場合この例は...

Int32[] numbers = new Int32[] { 1, 2, 1, 3, 1, 5, 3, 1 };

var numberText =
(
    from n in numbers
    where n > 0
    select new
    {
        Number = n,
        Text = 
        (
            n == 1 ? "One" :
            n == 2 ? "Two" :
            n == 3 ? "Three" : "Unknown"
        )
    }
);
101
user110714

ここまでは私の進行状況であり、まだまったく機能していませんが、始まりです。

var query2 = from items in db.cdsItems
             where items.ItemTrackingCode.Equals("A") && (items.ItemQtyOnHand - items.ItemQtyCommitted) > 0
             select new  {
                           items,
                           qty =
                                 (
                                    items.ItemPromoFlag.Equals("1") ? "100000" :
                                    items.ItemCat1.Equals("1") ? "100000" :
                                    items.ItemSaleStatus.Equals("O") ? "0" :
                                    (items.ItemQtyOnHand - items.ItemQtyCommitted).ToString
                                 )
                         };

この構文は私にはとても厄介なようです...私は単にSQLをパススルーするかもしれません。

3
Scott Kramer

http://bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx 機能的なスイッチケースの実装について説明しています。

1

まず、更新するアイテムを選択します。次に、それらを通常のC#で更新します。変更を送信します。

    var q = from osc in MyDataContext.osc_products
            join cds in cds_oeinvitem on osc.products_model equals cds.itemno into p
            where osc.Itemwebflag == 'Y'
            select p;

    foreach (var item in q)
    {
        if (item.itempromoflag != "N")
            item.products_quantity = 100000;
        else if ((new[] { 1, 2, 31 }.Contains(item.itemcat1)) && (item.itemsalestatus == 'S'))
            item.products_quantity = 100000;
        else if (item.itemsalestatus == 0)
            item.products_quantity = 0;
        else
            item.products_quantity = item.itemqtyonhand - item.itemqtycommitted;
    }

    MyDataContext.SubmitChanges();
1
bruno conde

ストアドプロシージャで単一のUPDATEステートメントを使用すると、アプリケーションサーバーで更新のループを実行するよりも優れています。

1
KM.

一括更新を実行していますが、リンクは純粋にクエリおよびオブジェクト選択ツールです。ジョブに適切なツールを使用します。この場合は間違いなくデータベースサーバーです。

0
jrista

Linqには「Update」ステートメントはありません(LinqToSQLまたはLinqToEntitiesのいずれのフレーバーを使用しても)。

Linqはクエリ言語を厳密に提供します。

LinqToSQLを使用してデータを更新する場合、まず更新する必要のあるアイテムのコンテキストを照会し、それらをループしてプロパティを変更し、最後にSubmitChangesを呼び出して変更をデータベースに保存する必要があります。

0
Denis Troller