2009-06-01 165 views
35

我需要一些幫助,CASE語句LINQ(C#):LINQ 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; 

此查詢更新從生產到商業網站的庫存狀態。

+0

使用代碼塊男人 – Chance 2009-06-01 18:17:37

回答

84

如果它只是CASE聲明LINQ你後(讀您的評論),那麼這樣的一個例子是...

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" 
     ) 
    } 
); 
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(); 
+0

嗯...這看起來很奇怪... – 2009-06-01 19:23:32

0

您正在執行批量更新,但鏈接純粹是查詢和對象選擇工具。使用適當的工具進行工作...在這種情況下,這絕對是數據庫服務器。

+0

不是真的,這現在轉儲到XML,我會離開的SQL語句,如果是這樣的話!!,也不是一個完整的SQL聲明,它是從sql2005更新 - > mysql – 2009-06-01 19:18:04

+0

那麼,無論涉及多少數據庫服務器或類似的東西......如果UPDATE語句(片段或其他)是你想要做的......這絕對是一個批量工作。 OR映射器(這是LINQ to SQL的作用)是用來處理對象到關係映射的。它們不是爲了處理批量處理而設計的,並且會嚴重影響此類操作的性能。最好是將批量處理留給最好的工具......其中大部分時間是數據庫服務器(或者在你的情況下,兩臺服務器)。 – jrista 2009-06-01 19:24:33

+0

好的,很好的信息,但我不批量更新,爲了清晰起見,我刪除了那個 – 2009-06-01 19:26:48

1

在存儲過程中使用您的單個UPDATE語句,將比在應用程序服務器上執行更新循環更好。

0

有Linq中沒有「更新」語句(取你使用的味道,無論是LinqToSQL或LinqToEntities)。

Linq嚴格提供查詢語言。

如果您正在使用LinqToSQL並希望更新數據,則需要先查詢需要更新的項目的上下文,然後循環更改其屬性,最後調用SubmitChanges將更改保存到數據庫。

3

這是我迄今取得的進展,在不工作的所有還沒有,不過是一個開始:

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。