Выражение 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;
Этот запрос обновляет состояние запасов с производства на сайт коммерции.
Ответы
Ответ 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 в хранимой процедуре, будет лучше, чем выполнение цикла обновлений на сервере приложений.
Ответ 5
http://bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx рассказывает о реализации функционального коммутационного случая.
Ответ 6
Вы выполняете массовое обновление, но ссылка - это просто инструмент для запроса и выбора объектов. Используйте подходящий инструмент для задания... который в данном случае определенно является сервером базы данных.
Ответ 7
В Linq нет выражения "Обновить" (какой бы вкус вы ни использовали, будь то LinqToSQL или LinqToEntities).
Linq строго предоставляет язык запросов.
Если вы используете LinqToSQL и хотите обновлять данные, вам нужно сначала запросить контекст для элементов, которые вам нужно обновить, а затем перебрать их, чтобы изменить их свойство, и, наконец, вызвать SubmitChanges для сохранения изменений в базе данных.