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)