C#-Linq案例陈述

我需要有关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;

此查询将库存状态从生产更新为贸易站点。

Scott Kramer asked 2020-07-12T06:25:16Z
7个解决方案
102 votes

如果它只是LINQ中的CASE语句,请阅读(您的评论),然后再举一个例子。

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"
        )
    }
);
Aaron Hall answered 2020-07-12T06:25:35Z
3 votes

到目前为止,这是我的进步,目前还没有任何进展,但这只是一个开始:

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。

Scott Kramer answered 2020-07-12T06:26:00Z
1 votes

首先,选择要更新的项目。 然后,使用常规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();
bruno conde answered 2020-07-12T06:26:21Z
1 votes

在存储过程中使用单个UPDATE语句,将比在应用程序服务器上执行更新循环更好。

KM. answered 2020-07-12T06:26:44Z
1 votes

[http://bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx]讨论了实现功能开关的情况。

Vasu Balakrishnan answered 2020-07-12T06:27:04Z
0 votes

您正在执行批量更新,但是链接纯粹是一个查询和对象选择工具。 为作业使用适当的工具...在这种情况下,绝对是数据库服务器。

jrista answered 2020-07-12T06:27:24Z
0 votes

Linq中没有“ Update”语句(无论使用哪种口味,无论是LinqToSQL还是LinqToEntities)。

Linq严格提供查询语言。

如果您使用的是LinqToSQL并想更新数据,则需要首先在上下文中查询需要更新的项目,然后将它们循环以更改其属性,最后调用SubmitChanges将更改保存到数据库。

Denis Troller answered 2020-07-12T06:27:55Z
translate from https://stackoverflow.com:/questions/936028/linq-case-statement