Подтвердить что ты не робот

Выражение case case

Мне нужна помощь с инструкциями CASE в linq (С#):

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;

Этот запрос обновляет состояние запасов с производства на сайт коммерции.

4b9b3361

Ответ 1

Если это только оператор 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"
        )
    }
);

Ответ 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

Ответ 3

Сначала выберите элементы, которые вы хотите обновить. Затем обновите их в обычном С#. Отправить изменения.

    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 в хранимой процедуре, будет лучше, чем выполнение цикла обновлений на сервере приложений.

Ответ 6

Вы выполняете массовое обновление, но ссылка - это просто инструмент для запроса и выбора объектов. Используйте подходящий инструмент для задания... который в данном случае определенно является сервером базы данных.

Ответ 7

В Linq нет выражения "Обновить" (какой бы вкус вы ни использовали, будь то LinqToSQL или LinqToEntities).

Linq строго предоставляет язык запросов.

Если вы используете LinqToSQL и хотите обновлять данные, вам нужно сначала запросить контекст для элементов, которые вам нужно обновить, а затем перебрать их, чтобы изменить их свойство, и, наконец, вызвать SubmitChanges для сохранения изменений в базе данных.