【问题标题】:linq case statementlinq 案例陈述
【发布时间】:2010-10-30 11:29:11
【问题描述】:

我需要一些关于 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;

此查询将库存状态从生产站点更新到商业站点。

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    如果它只是 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"
            )
        }
    );
    

    【讨论】:

    • 完美解决了重复的字典键解决方案。 Dictionary inputLookup = inputList .Select(x => new KeyValuePair(x.Split(','), x)) .Where(r => r.Key.Length > 2 ) .ToDictionary(y => ( y.Key.Length == 3 ? y.Key[1] : y.Key[1] + '#' + y.Key[2] ) , y => y.Value) ;
    【解决方案2】:

    这是我到目前为止的进展,还没有工作,但这是一个开始:

    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。

    【讨论】:

    • 不等于怎么办? items.ItemPromoFlag.Equals("1") != 不起作用
    • @Scott:我认为您应该使用 == 和 != 运算符而不是 .Equals()。它更具可读性。
    • 我会尝试,但是我认为编译器会抱怨--
    【解决方案3】:

    首先,选择要更新的项目。然后,在常规 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();
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 所以你是说不要使用 linq 来解决这个问题?
      • @Nathan Koop,如果您的数据库访问是通过 linq,请使用 linq 调用该过程。基于集合的 UPDATE 与循环 linq UPDATE 的性能差异将是显着的
      【解决方案5】:

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

      【讨论】:

      • 不是真的,现在转储到xml,如果是这种情况我会留下sql语句!!,它也不是一个完整的sql语句,它是从sql2005更新的--> mysql跨度>
      • 好吧,不管涉及多少数据库服务器或类似的东西......如果 UPDATE 语句(片段或其他)是你想要做的......那绝对是一个批量工作。 OR 映射器(即 LINQ to SQL)旨在处理对象到关系的映射。它们不是为处理批量处理而设计的,并且会严重影响此类操作的性能。最好将批量处理留给最适合它们的工具......大多数时候,它是一个数据库服务器(或者在你的情况下,是两台服务器。)
      • 好的,很好的信息,但我不是批量更新,为了清楚起见,我删除了它
      • 好吧,在这种情况下,请忽略我的回答。 :P
      【解决方案6】:

      Linq 中没有“更新”语句(无论您使用哪种风格,无论是 LinqToSQL 还是 LinqToEntities)。

      Linq 严格提供查询语言。

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

      【讨论】:

      • 我只需要帮助学习 LINQ 中的 CASE equiv,我编辑了我的问题并删除了更新
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2016-05-13
      • 2016-02-21
      • 1970-01-01
      • 2012-09-08
      • 2013-10-14
      相关资源
      最近更新 更多