J'ai besoin d'aide avec les instructions CASE dans linq (c #):
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
Mon début à la conversion en linq, (j'apprends toujours):
cdsDBDataContext db = new cdsDBDataContext(); var query = from items in db.cdsItems where items.ItemHandHeldFlag.Equals("Y") && items.ItemQtyOnHand - items.ItemQtyCommitted > 0 select items;
Cette requête met à jour l'état du stock de la production vers un site de commerce.
Si c'est juste la déclaration CASE dans LINQ votre après (lisez votre commentaire) alors un exemple de ceci est ...
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"
)
}
);
Voici mes progrès jusqu'à présent, ne fonctionne pas encore du tout, mais c'est un début:
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
)
};
Cette syntaxe me semble tellement gênante ... Je pourrais simplement passer par SQL.
http://bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx parle de l'implémentation d'un boîtier de commutateur fonctionnel.
Tout d'abord, sélectionnez les éléments que vous souhaitez mettre à jour. Ensuite, mettez-les à jour en C # normal. Soumettre des changements.
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();
utiliser votre seule instruction UPDATE dans une procédure stockée, sera mieux que de faire une boucle de mises à jour sur le serveur d'applications.
Vous effectuez une mise à jour groupée, mais le lien est purement un outil de requête et de sélection d'objet. Utilisez l'outil approprié pour le travail ... qui dans ce cas est certainement le serveur de base de données.
Il n'y a pas de déclaration "Update" dans Linq (quelle que soit la saveur que vous utilisez, que ce soit LinqToSQL ou LinqToEntities).
Linq fournit strictement un langage d'interrogation.
Si vous utilisez LinqToSQL et souhaitez mettre à jour des données, vous devez d'abord interroger le contexte pour les éléments que vous devez mettre à jour, puis les parcourir pour modifier leur propriété et enfin appeler SubmitChanges pour enregistrer les modifications dans la base de données.