web-dev-qa-db-fra.com

déclaration de cas linq

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.

44
Scott Kramer

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"
        )
    }
);
101
user110714

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.

3
Scott Kramer

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.

1

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();
1
bruno conde

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.

1
KM.

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.

0
jrista

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.

0
Denis Troller