J'ai la requête Transact SQL suivante à l'aide d'une union. J'ai besoin de quelques conseils pour savoir à quoi cela ressemblerait dans LINQ, c'est-à-dire que certains exemples seraient agréables ou si quelqu'un peut recommander un bon tutoriel sur UNIONS dans 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
Notez que le SQL d'origine est fusion les 2 sélections ne les concaténent pas. J'ai besoin de savoir comment fusionner les résultats, c'est-à-dire supprimer les doublons et additionner la valeur du montant des lignes en cas de duplication basée sur le code à barres.
Trois concepts Linq utiles fonctionnant sur des décors. Étant donné l'ensemble c
et l'ensemble e
:
Concat vous donne tout dans c
ou 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 vous donne également tout dans c
et e
, mais supprime tous les doublons:
(From c In db.Customers _
Select c.Country).Union(From e In db.Employees _
Select e.Country)
Sauf vous donne tout dans c
qui n'est pas dans e
:
(From c In db.Customers _
Select c.Country).Except(From e In db.Employees Select e.Country)
Voici un exemple d'union générique, sans égard au scénario que vous avez publié:
var something =
(from e in _repository
select new { e.Property1, e.Property2 }).Union(
(from e in _repository
select new { e.Property1, e.Property2 }));
Il y a 101 échantillons Linq - avec deux échantillons d'union nion1 et nion2
Cette instruction Linq devrait vous obtenir les mêmes résultats que votre SQL: (elle a pour moi sur un jeu d'enregistrements de test)
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)
});