2010-04-30 12 views
19

Tengo la siguiente consulta SQL Transact usando una unión. Necesito algunos consejos sobre cómo se vería esto en LINQ, por ejemplo, algunos ejemplos serían buenos o si alguien puede recomendar un buen tutorial sobre SINDICATOS en linq.cómo convertir la unión sql a linq

select top 10 Barcode, sum(ItemDiscountUnion.AmountTaken) from 
(SELECT d.Barcode,SUM(AmountTaken) AmountTaken 
    FROM [Aggregation].[dbo].[DiscountPromotion] d 

    GROUP BY d.Barcode 

    UNION ALL 

    SELECT i.Barcode,SUM(AmountTaken) AmountTaken 
    FROM [Aggregation].[dbo].ItemSaleTransaction i 

    group by i.Barcode) ItemDiscountUnion 

    group by Barcode 

Nota SQL original es la fusión de el 2 NO selecciona la concatenación de ellas. Necesito saber cómo fusionar los resultados, es decir, eliminar duplicados y sumar el valor de la cantidad de filas donde hay duplicación basada en el código de barras.

+0

http://msdn.microsoft.com/en-us/library/bb386979.aspx – Andrey

+0

simplemente use el operador de la Unión como @ Ian-P sugirió – Guillaume86

Respuesta

30

Tres conceptos Linq útiles que operan en conjuntos. Conjunto dado c y establecer e:

de concatenación le da todo en c o e:

(From c In db.Customers Select c.Phone).Concat(_ 
      From c In db.Customers Select c.Fax).Concat(_ 
      From e In db.Employees Select e.HomePhone) 

(From c In db.Customers _ 
      Select Name = c.CompanyName, Phone = c.Phone).Concat(From e In db.Employees _ 
      Select Name = e.FirstName & " " & e.LastName, Phone = e.HomePhone) 

Unión también le da todo en c y e, pero elimina los duplicados:

(From c In db.Customers _ 
     Select c.Country).Union(From e In db.Employees _ 
     Select e.Country) 

Excepto le da todo en c que no está en e:

(From c In db.Customers _ 
      Select c.Country).Except(From e In db.Employees Select e.Country) 
+24

'Concat',' Union' y 'Except' son cosas diferentes:' Concat' solo fusionará dos secuencias en una sola, 'Union' se fusionará pero eliminará duplicados (distintos), y' Except' es completamente diferente: devuelve los elementos de la primera secuencia que no pertenecen a la segunda secuencia. (el último es 'Intersecar': devuelve los elementos comunes de 2 secuencias) – Guillaume86

+0

Como mencionó Guillaume86, esta publicación es incorrecta. Un pequeño cambio en la redacción arreglaría fácilmente el problema. – Griffin

+0

Creo que vale la pena señalar que, como 'Union',' Except' y 'Interset' también eliminan los duplicados, incluidos los duplicados en las secuencias fuente. – NetMage

4

Hay los 101 Linq Samples - con dos muestras de unión Union1 y Union2

Esta declaración de LINQ debe obtener los mismos resultados que su SQL: (que tiene para mí en un protocolo de ensayo-set)

var results = (from a in (from d in DiscountPromotions 
      group d by d.BarCode into g 
      select new { 
       BarCode = g.Key, 
       AmountTaken = g.Sum(p => p.AmountTaken) 
       }).Union(from i in ItemSaleTransactions 
      group i by i.BarCode into o 
      select new { 
       BarCode = o.Key, 
       AmountTaken = o.Sum(i => i.AmountTaken) 
       }) group a by a.BarCode into b 
       select new { 
        BarCode = b.Key, 
        AmountTaken = b.Sum(c => c.AmountTaken) 
       }); 
10

He aquí un ejemplo de una unión genérica, sin tener en cuenta el escenario informados:

var something = 
       (from e in _repository 
       select new { e.Property1, e.Property2 }).Union(
       (from e in _repository 
       select new { e.Property1, e.Property2 })); 
Cuestiones relacionadas