2009-06-01 154 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。