如何将 sql union 转换为 linq

Posted

技术标签:

【中文标题】如何将 sql union 转换为 linq【英文标题】:how to convert sql union to linq 【发布时间】:2011-02-14 05:04:13 【问题描述】:

我有以下使用联合的 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 个选择不连接它们。 我需要知道如何合并结果,即删除重复项并根据条形码对存在重复项的行量值求和。

【问题讨论】:

msdn.microsoft.com/en-us/library/bb386979.aspx 按照@Ian-P 的建议使用联合运算符 【参考方案1】:

在集合上运行的三个有用的 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)

Union 还为您提供 ce 中的所有内容,但会删除所有重复项:

(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)

【讨论】:

ConcatUnionExcept 是不同的东西:Concat 只会将两个序列合并为一个,Union 将合并但删除重复项(不同),Except完全不同:它返回第一个序列中不属于第二个序列的元素。 (最后一个是Intersect:返回2个序列的共同元素) 正如 Guillaume86 提到的,这篇文章是不正确的。稍微修改一下措辞就可以轻松解决问题。 我认为值得注意的是,像UnionExceptInterset 也会删除所有重复项,包括源序列中的重复项。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

有101 Linq Samples - 有两个联合样本Union1 和Union2

这个 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)
                );

【讨论】:

以上是关于如何将 sql union 转换为 linq的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SUM 计算将 SQL 转换为 Linq

如何将 linq 查询转换为 SQL 查询?

如何将SQL查询转换为LINQ?

如何将 SQL 中的多个内部联接转换为 LINQ?

如何将此 SQL 内部联接查询转换为 LINQ 语法?

如何将sql查询转换为linq查询