如何将sql union转换为linq

low*_*ern 26 c# sql linq union

我有一个使用union的以下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
Run Code Online (Sandbox Code Playgroud)

请注意,原始SQL正在 合并 2个选择NOT连接它们.我需要知道如何合并结果,即删除重复项,并根据条形码对存在重复的行数值求和.

Ami*_*rma 36

三个有用的Linq概念在集合上运行.给定集合c和集合e:

Concat为您提供所有内容ce:

(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)
Run Code Online (Sandbox Code Playgroud)

联盟也为您提供了一切ce,但是通过删除重复项:

(From c In db.Customers _
        Select c.Country).Union(From e In db.Employees _
        Select e.Country)
Run Code Online (Sandbox Code Playgroud)

除了给你一切c不在的东西e:

(From c In db.Customers _
             Select c.Country).Except(From e In db.Employees Select e.Country)
Run Code Online (Sandbox Code Playgroud)

  • `Concat`,`Union`和`Except`是不同的东西:`Concat`将两个序列合并为一个,`Union`将合并但删除重复(distinct),`Except`完全不同:它返回元素第一个序列不属于第二个序列.(最后一个是`Intersect`:从2个序列中返回公共元素) (24认同)

Ian*_*n P 12

这是一个通用联合的示例,不考虑您发布的场景:

var something =
                (from e in _repository
                 select new { e.Property1, e.Property2 }).Union(
                (from e in _repository
                 select new { e.Property1, e.Property2 }));
Run Code Online (Sandbox Code Playgroud)


Nic*_*ray 5

101个Linq样本 -带有两个联合样本Union1Union2

此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)
                });
Run Code Online (Sandbox Code Playgroud)