如何将 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 为您提供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)
【讨论】:
Concat
、Union
和 Except
是不同的东西:Concat
只会将两个序列合并为一个,Union
将合并但删除重复项(不同),Except
完全不同:它返回第一个序列中不属于第二个序列的元素。 (最后一个是Intersect
:返回2个序列的共同元素)
正如 Guillaume86 提到的,这篇文章是不正确的。稍微修改一下措辞就可以轻松解决问题。
我认为值得注意的是,像Union
、Except
和Interset
也会删除所有重复项,包括源序列中的重复项。【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章