2010-07-08 9 views
3

그래서 이것은 내가 뭘하려고 오전 있습니다 : SQL에 충분한Linq에 - 투 - SQL 도움말 - 선택 중복 행

select subscriber, count(subscriber) 
from subscribers 
where subscriber = subscribedTo 
group by subscriber 
having count(subscriber) > 1 

쉽습니다. 나는 이것을 LINQ에 쓰는 방법을 알 수 없다. 누구든지 이것에 대해 어떻게 알아요?

표는 ID, subscriber 및 subscribedTo의 세 열입니다. 구독자가 == subscribedTo 인 중복 행을 찾으려고합니다.

답변

4

var duplicatedSubscribers= 
    from s in subscribers 
    where s.subscribedTo == s.subscriber 
    group s by s.subscriber into g 
    where g.Count() > 1 
    select new { subscriber = g.Key, Count = g.Count() }; 

당신은 당신이 할 수있는 중 하나를 사용하는 쿼리 구문 http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

+0

이것은 작동하지 않습니다. g.subscriber를 g.FirstOrDefault(). subscriber로 변경해야했습니다. 그것 이외의, 굉장한. – Jason

+0

당신은 그룹 옵션의 올바른 사용법으로 코드를 수정하고 여분의 FirtOrDefault 연산을 피할 수 있습니다. – CriGoT

0

내 대답을 참조하십시오 : 내 클래스의 목록을 열거

public class MyClass 
    { 

     public int ID 
     { 
      get; set; 
     } 

     public string Subscriber 
     { 
      get; set; 
     } 

     public string SubscriberTo 
     { 
      get; set; 
     } 
    } 

그리고 코드 것은 :

var myList = new List<MyClass>(); 

      var douplicateRows = from element in myList 
               where 
                string.Compare(element.Subscriber, element.SubscriberTo, 
                   StringComparison.InvariantCultureIgnoreCase) == 0 
               group element by element.Subscriber 
               into mygroup 
               where mygroup.Count() > 1 
               select new 
                 { 
                  Subscriber = mygroup.Key, 
                  Elements= mygroup 
                 }; 

희망이 도움이됩니다.

0

에 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)); 

     }