whats news new microsoft features docs compute c# sql linq union

c# - news - como convertir sql union a linq



new features c# (3)

Tengo la siguiente consulta Transact SQL utilizando una unión. Necesito algunos consejos sobre cómo se vería esto en LINQ, es decir, algunos ejemplos serían buenos o si alguien puede recomendar un buen tutorial sobre UNIONS en 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

Tenga en cuenta que el SQL original está fusionando los 2 selecciones NO concatenándolos. Necesito saber cómo combinar los resultados, es decir, eliminar los duplicados y sumar el valor de la cantidad de filas donde hay duplicación basada en el código de barras.


Aquí hay un ejemplo de una unión genérica, sin importar el escenario que publicaste:

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


Hay 101 muestras de Linq , con dos muestras de unión Union2 y Union2

Esta declaración de Linq debería obtener los mismos resultados que su SQL: (tiene para mí en un conjunto de registros de prueba)

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


Tres conceptos linq útiles operando en sets. Dado el conjunto c y el conjunto e :

Concat te 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)

Union también te da todo en c y e , pero elimina cualquier duplicado:

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

Excepto te 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)