![](/img/trans.png)
[英]How can I use LINQ to select columns from multiple tables with Count and Group By?
[英]How can I group with multiple columns and count?
首先,我無法在標題中正確解釋我的問題,但我認為它不是重復的。 我有一個 model 列表,它 id 喜歡按多個字段分組,然后將它們計入新字段,並將所有其他字段保留在結果中。 對於錯誤的解釋,我很抱歉,我已經研究了幾個小時如何做到這一點,但我無法弄清楚..我想從中得到:
銷售編號 | 名稱 | 產品 | 地址 | 電話 | 打印類型 |
---|---|---|---|---|---|
112 | 喬 | 蘋果 | 新街12 | 11223344 | 打印類型 1 |
112 | 喬 | 蘋果 | 新街12 | 11223344 | 打印類型2 |
112 | 喬 | 蘋果 | 新街12 | 11223344 | 打印類型2 |
112 | 喬 | 蘋果 | 新街12 | 11223344 | 打印類型2 |
112 | 喬 | 蘋果 | 新街12 | 11223344 | 打印類型3 |
113 | 喬 | 獼猴桃 | 新街12 | 11223344 | 打印類型3 |
114 | 簡 | 橙子 | 新街19號 | 72754722 | 打印類型 1 |
115 | 約翰 | 橙子 | 新街11號 | 99236527 | 打印類型2 |
115 | 約翰 | 橙子 | 新街11號 | 99236527 | 打印類型2 |
按 SaleID 和 PrintType 分組,如下所示:
銷售編號 | 名稱 | 產品 | 地址 | 電話 | NoOfPrintType1 | NoOfPrintType2 | NoOfPrintType3 |
---|---|---|---|---|---|---|---|
112 | 喬 | 蘋果 | 新街12 | 11223344 | 1個 | 3個 | 1個 |
113 | 喬 | 獼猴桃 | 新街12 | 11223344 | 0 | 0 | 1個 |
114 | 簡 | 橙子 | 新街19號 | 72754722 | 1個 | 0 | 0 |
115 | 約翰 | 橙子 | 新街11號 | 99236527 | 0 | 2個 | 0 |
最好 id 喜歡使用 LINQ,但 id 也可以使用 SQL,id 只是想盡可能避免使用 for 循環。 編輯:有一定數量的打印類型,因此它不需要是動態的。
為了聚合一組 PrintTypes 的數據,您可以按 SaleId 分組,因為地址、電話和產品等附加數據對於 SaleId 是相同的(基於您的示例數據)。
var aggregated = from x in GenerateSales()
group x by x.SaleId into g // Assume that SaleId is the key that you want to group by
select new Aggregate()
{
SaleId = g.Key,
// Additional data that are the same for all rows with the same SaleId
Name = g.First().Name,
Product = g.First().Product,
Address = g.First().Address,
Phone = g.First().Phone,
// Calculate counts of Print Types
NoOfPrintType1 = g.Where(x => x.PrintType == "PrintType1").Count(),
NoOfPrintType2 = g.Where(x => x.PrintType == "PrintType2").Count(),
NoOfPrintType3 = g.Where(x => x.PrintType == "PrintType3").Count(),
};
Linq 語句首先按 SaleId 分組,然后為每個 SaleId 創建一個 object,它包括
您可以在下面找到生成測試數據並輸出結果的示例。
112 | Joe | Apple | New street 12 | 11223344 | 1 | 3 | 1
113 | Joe | Kiwi | New street 12 | 11223344 | 0 | 0 | 1
114 | Jane | Orange | New street 19 | 72754722 | 1 | 0 | 0
115 | John | Orange | New street 11 | 99236527 | 0 | 2 | 0
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqTest
{
class Sale
{
public string SaleId { get; set; }
public string Name { get; set; }
public string Product { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public string PrintType { get; set; }
}
class Aggregate
{
public string SaleId { get; set; }
public string Name { get; set; }
public string Product { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public int NoOfPrintType1 { get; set; }
public int NoOfPrintType2 { get; set; }
public int NoOfPrintType3 { get; set; }
public override string ToString()
{
return $"{SaleId} | {Name} | {Product} | {Address} | {Phone} | {NoOfPrintType1} | {NoOfPrintType2} | {NoOfPrintType3}";
}
}
class Program
{
static void Main(string[] args)
{
var aggregated = from x in GenerateSales()
group x by x.SaleId into g // Assume that SaleId is the key that you want to group by
select new Aggregate()
{
SaleId = g.Key,
// Additional data that are the same for all rows with the same SaleId
Name = g.First().Name,
Product = g.First().Product,
Address = g.First().Address,
Phone = g.First().Phone,
// Calculate counts of Print Types
NoOfPrintType1 = g.Where(x => x.PrintType == "PrintType1").Count(),
NoOfPrintType2 = g.Where(x => x.PrintType == "PrintType2").Count(),
NoOfPrintType3 = g.Where(x => x.PrintType == "PrintType3").Count(),
};
foreach(var a in aggregated)
{
Console.WriteLine(a.ToString());
}
}
static IEnumerable<Sale> GenerateSales()
{
yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType1" };
yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType2" };
yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType2" };
yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType2" };
yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType3" };
yield return new Sale() { SaleId = "113", Name = "Joe", Product = "Kiwi", Address = "New street 12", Phone = "11223344", PrintType = "PrintType3" };
yield return new Sale() { SaleId = "114", Name = "Jane", Product = "Orange", Address = "New street 19", Phone = "72754722", PrintType = "PrintType1" };
yield return new Sale() { SaleId = "115", Name = "John", Product = "Orange", Address = "New street 11", Phone = "99236527", PrintType = "PrintType2" };
yield return new Sale() { SaleId = "115", Name = "John", Product = "Orange", Address = "New street 11", Phone = "99236527", PrintType = "PrintType2" };
}
}
}
你可以使用這個 SQL 查詢
with x as (
SELECT [SaleID],[Name],[Product],[Address],[Phone],[PrintType]
,case when [PrintType]='PrintType1' then count(*) else 0 end NoOfPrintType1
,case when [PrintType]='PrintType2' then count(*) else 0 end NoOfPrintType2
,case when [PrintType]='PrintType3' then count(*) else 0 end NoOfPrintType3
FROM [Table_1]
group by [SaleID] ,[Name],[Product],[Address],[Phone] ,[PrintType])
select [SaleID],[Name],[Product],[Address],[Phone]
,sum(NoOfPrintType1)NoOfPrintType1
,sum(NoOfPrintType2)NoOfPrintType2
,sum(NoOfPrintType3)NoOfPrintType3 from x
group by [SaleID]
,[Name],[Product],[Address],[Phone]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.