ユニオンを使用した次のTransact SQLクエリがあります。これがLINQでどのように表示されるか、つまりいくつかの例がいいか、誰かがlinqのUNIONSに関する優れたチュートリアルを推奨できるかどうかについて、いくつかの指針が必要です。
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
元のSQLはmergingであることに注意してください。2はそれらを連結しないことを選択します。結果をマージする方法、つまり重複を削除し、バーコードに基づいて重複がある行の値を合計する方法を知る必要があります。
セットで動作するLinqの3つの便利な概念。与えられたセットc
とセットe
:
Concatはc
または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はc
とe
のすべても提供しますが、重複を削除します。
(From c In db.Customers _
Select c.Country).Union(From e In db.Employees _
Select e.Country)
を除いて、c
にないe
にあるすべてのものを提供します。
(From c In db.Customers _
Select c.Country).Except(From e In db.Employees Select e.Country)
投稿したシナリオに関係なく、一般的なユニオンの例を次に示します。
var something =
(from e in _repository
select new { e.Property1, e.Property2 }).Union(
(from e in _repository
select new { e.Property1, e.Property2 }));
101 Linq Samples -2つのユニオンサンプル nion1 および nion2 があります。
このLinqステートメントでは、SQLと同じ結果が得られるはずです(テストレコードセットで私に教えてもらいます)。
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)
});