2009-06-01 18 views
35

necesito un poco de ayuda con las instrucciones CASE en LINQ (C#):LINQ declaración de caso

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 

Mi inicio en la conversión a LINQ, (todavía estoy aprendiendo):

cdsDBDataContext db = new cdsDBDataContext(); 
    var query = from items in db.cdsItems 
       where items.ItemHandHeldFlag.Equals("Y") && 
       items.ItemQtyOnHand - items.ItemQtyCommitted > 0 
    select items; 

Esta consulta actualiza el estado del stock desde la producción a un sitio de comercio.

+0

usa el bloque de código man – Chance

Respuesta

84

si es sólo la CASO declaración en LINQ su después (leer su comentario) a continuación un ejemplo de esto es ...

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

Primero, seleccione los elementos que desea actualizar. Luego, actualícelos en C# normal. Presentar cambios.

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(); 
+0

hmmm ... esto parece extraño ... –

0

Está realizando una actualización masiva, pero el enlace es puramente una herramienta de consulta y selección de objetos. Use la herramienta adecuada para el trabajo ... que en este caso es definitivamente el servidor de la base de datos.

+0

no, esta descarga a xml ahora, ¡dejaría la declaración sql si ese fuera el caso! Tampoco es un sql completo declaración, está actualizando desde sql2005 -> mysql –

+0

Bueno, independientemente de la cantidad de servidores de bases de datos involucrados o algo así ... si la instrucción UPDATE (fragmento u otro) es lo que estás tratando de hacer ... definitivamente es un volumen trabajo. O los correlacionadores (que es lo que LINQ to SQL) están diseñados para manejar el mapeo relacional de objetos. No están diseñados para manejar el procesamiento masivo y pueden afectar gravemente el rendimiento de tales operaciones. Lo mejor es dejar el procesamiento masivo a las herramientas que mejor lo hacen ... que, la mayoría de las veces, es un servidor de base de datos (o en su caso, dos servidores). – jrista

+0

bien, buena información, pero no estoy actualizando a granel. , Lo eliminé para mayor claridad –

1

use su única instrucción UPDATE en un procedimiento almacenado, será mejor que hacer un bucle de actualizaciones en el servidor de aplicaciones.

+0

¿Está diciendo que no use linq para este problema? –

+0

@ Nathan Koop, si su acceso de acceso directo es a través de linq, use linq para llamar al procedimiento. la diferencia de rendimiento de una ACTUALIZACIÓN basada en conjunto vs.una ACTUALIZACIÓN de linq de bucle será significativa –

+0

suena bien, gracias, también estoy aprendiendo linq. –

0

No hay ninguna declaración "Actualizar" en LINQ (lo sabor que usa, ya sea LinqToSQL o LinqToEntities).

Linq proporciona estrictamente un lenguaje de consulta.

Si está utilizando LinqToSQL y desea actualizar los datos, primero debe consultar el contexto de los elementos que necesita actualizar, luego recorrerlos para cambiar su propiedad y finalmente llamar a SubmitChanges para guardar los cambios en la base de datos .

+0

Solo necesito ayuda para aprender el equivalente de CASE en LINQ, edité mi pregunta y eliminé la ACTUALIZACIÓN –

3

Aquí es mi progreso hasta ahora, no funciona en absoluto todavía, pero es un comienzo:

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 
           ) 
         }; 

Esta sintaxis parece tan incómoda para mí ... yo podría de paso a través de SQL.

+0

¿cómo se hace un no igual? items.ItemPromoFlag.Equals ("1") ! = no funciona –

+0

items.ItemPromoFlag! = "1" –

+0

@Scott: creo que deberías usar los operadores == y! = en lugar de .Equals(). Es mucho más legible. –

Cuestiones relacionadas