에 LINQ 샘플을 확인 할 수 있습니다하려고 할 수 있습니다, 또는 당신은 확장 방법을 사용할 수 있습니다. 나는 둘 다에서 예제를 제공 할 것이다. 일반적으로 WHERE 필터링을 이동할 수 있습니다. 나는 당신이 코드를 가지고 놀고 그룹화의 차이를 볼 수 있도록 그것을 분리하여 유지하기로 결정했다. Linq To SQL에서 WHERE 조건을 그룹화 된 식으로 이동하면 SQL로 변환하는 것이 더 좋습니다.
엔티티는 아마도 다음과 같습니다.
public class CustomRowType
{
public int ID { get; set;}
public string Subscriber { get; set; }
public int SubscribedTo { get; set; }
}
먼저 확장 방법을 사용한 예입니다. 이것이 내가 일반적으로 선호하는 방식입니다.
public void GroupTest()
{
// Create some data to work with.
List<CustomRowType> testData = new List<CustomRowType>();
testData.Add(new CustomRowType() { ID = 1, Subscriber = "Subscriber 1", SubscribedTo = 40 });
testData.Add(new CustomRowType() { ID = 2, Subscriber = "Subscriber 2", SubscribedTo = 1 });
testData.Add(new CustomRowType() { ID = 3, Subscriber = "Subscriber 3", SubscribedTo = 2 });
testData.Add(new CustomRowType() { ID = 4, Subscriber = "Subscriber 4", SubscribedTo = 2 });
// Group data (equivalent to GROUP BY clause)
var grp = testData.GroupBy(
row => row.SubscribedTo,
(key, row) => new
{
Data = row,
// Here is the aggregate value
KeyCount = testData.Count(i => i.SubscribedTo == key)
}
);
var output = grp
// Filter group data (equivilent to HAVING clause)
.Where(g => g.KeyCount > 1) // Remove this line to see all aggregate data.
// Flatten group data (equivalent to SELECT clause)
.SelectMany(g => g.Data
.Select(d => d.ID.ToString() + "(" + d.Subscriber + ") -> " + d.SubscribedTo.ToString()+" with (" + g.KeyCount.ToString() + ") total subscriptions"))
.ToList();
listBox1.Items.Clear();
output.ForEach(s => listBox1.Items.Add(s));
}
다음은 쿼리 구문 예제입니다.
public void GroupTest()
{
// Create some data to work with.
List<CustomRowType> testData = new List<CustomRowType>();
testData.Add(new CustomRowType() { ID = 1, Subscriber = "Subscriber 1", SubscribedTo = 40 });
testData.Add(new CustomRowType() { ID = 2, Subscriber = "Subscriber 2", SubscribedTo = 1 });
testData.Add(new CustomRowType() { ID = 3, Subscriber = "Subscriber 3", SubscribedTo = 2 });
testData.Add(new CustomRowType() { ID = 4, Subscriber = "Subscriber 4", SubscribedTo = 2 });
// Using query syntax
var grp = (
from d in testData
group d by d.SubscribedTo into g
select g
);
var output = grp
// Filter
.Where(g => g.Count() > 1)
// Flatten group data (equivalent to SELECT clause)
.SelectMany(g => g
.Select(d => d.ID.ToString() + "(" + d.Subscriber + ") -> " + d.SubscribedTo.ToString()+" with (" + g.Key.ToString() + ") total subscriptions"))
.ToList();
listBox1.Items.Clear();
output.ForEach(s => listBox1.Items.Add(s));
}
이것은 작동하지 않습니다. g.subscriber를 g.FirstOrDefault(). subscriber로 변경해야했습니다. 그것 이외의, 굉장한. – Jason
당신은 그룹 옵션의 올바른 사용법으로 코드를 수정하고 여분의 FirtOrDefault 연산을 피할 수 있습니다. – CriGoT