2014-10-17 5 views
0

나는 다음과 같은 쿼리가 :왜이 Linq 쿼리가 고유 한 결과를 다시 가져 오지 않습니까?

List<Meeting> meetings = 
    (from m in crdb.tl_cr_Meetings 
    join p in crdb.tl_cr_Participants on m.MeetingID equals p.MeetingID 
    where p.TimeOut == null 
    select new Meeting 
     { 
     MeetingID = m.MeetingID, 
     MeetingName = m.MeetingName, 
     HostUserName = m.HostUsername, 
     BlueJeansMeetingID = m.tl_cr_BlueJeansAccount.MeetingID, 
     StartTime = m.StartTime, 
     Participants = (from pa in crdb.tl_cr_Participants 
         where pa.MeetingID == m.MeetingID 
         select pa.tl_cr_BlueJeansAccount.DisplayName).ToList() 
       }).Distinct().ToList(); 

을 그리고 나는 독특한 회의의 목록을 다시 가지고 싶어. 몇 가지 이유 때문에 데이터가 동일하더라도, 모든 참가자에 대한 항목을 다시 제공 :

enter image description here

오전 내가 누락 곳 그룹화?

편집

회의 클래스는 현재 매우 기본적인 :

public class Meeting 
{ 
    public int MeetingID { get; set; } 
    public string MeetingName { get; set; } 
    public string HostUserName { get; set; } 
    public DateTime StartTime { get; set; } 
    public List<string> Participants { get; set; } 
    public string BlueJeansMeetingID { get; set; } 
} 
+3

당신은'Meeting' 클래스의 코드를 게재 할 수 있습니까? 그것은'IEquatable'을 구현합니까? 이 질문을보고 싶을 수도 있습니다. (http://stackoverflow.com/questions/1365748/distinct-not-working-with-linq-to-objects) – juharr

답변

2

나는 모든 참가자에 대해 항목을 얻는 이유는 두 가지 조인을 수행한다는 것입니다. 그룹 가입을해야합니다.

var meetings = crdb.tl_cr_Meetings.GroupJoin(crdb.tl_cr_Participants, 
               k => k.MeetingID, 
               k => k.MeetingID, 
               (o,i) => new Meeting 
               { 
                MeetingID = o.MeetingID, 
                MeetingName = o.MeetingName, 
                HostUserName = o.HostUsername, 
                BlueJeansMeetingID = o.tl_cr_BlueJeansAccount.MeetingID, 
                StartTime = o.StartTime, 
                Participants = i.Select(s => s.DisplayName) 
               }).ToList(); 
+0

이것은 완벽합니다. 나는 전에 GroupJoin을 만나지 않았다. http://www.dotnetperls.com/groupjoin을 살펴본 후 위의 작업 방법을 이해하십시오! – Ben

+0

정말 대단합니다. 기꺼이 도와 드리겠습니다! – DaEagle

2
당신은 당신을 조언 juharr 방법을 사용하거나이 IEqualityComparer 인터페이스를 구현 한 별도의 클래스로 비교자를 구현이 비교자를 전달할 수

별개의 것으로.

public class MeetingComparer : IEqualityComparer<Meeting> 
{ 
    public bool Equals (Meeting x, Meeting y) 
    { 
     return x.smth.Equals (y.smth); 
    } 

    public int GetHashCode (Meeting obj) 
    { 
     return obj.smth.GetHashCode(); 
    } 
} 
1

나는 코드의 3 번째 줄 (join ...)을 삭제해야한다고 생각한다.

+0

여기에서 문제가되는 것은 회의에는 p.TimeOut이 null 인 참가자 만 포함됩니다. – Ben

1

이 Linq to Entities입니까? 에 관계없이, 나는 Distinct를 제거하고에 의해 그룹을 추가 할 것이다.

List<Meeting> meetings = 
    (from m in crdb.tl_cr_Meetings 
    join p in crdb.tl_cr_Participants on m.MeetingID equals p.MeetingID 
    where p.TimeOut == null 
    group m by new { m.MeetingID, m.MeetingName, m.HostUsername, MeetingID2 = m.tl_cr_BlueJeansAccount.MeetingID, m.StartTime } into m 
    select new Meeting 
    { 
     MeetingID = m.Key.MeetingID, 
     MeetingName = m.Key.MeetingName, 
     HostUserName = m.Key.HostUsername, 
     BlueJeansMeetingID = m.Key.MeetingID2, 
     StartTime = m.Key.StartTime, 
     Participants = (from pa in crdb.tl_cr_Participants 
         where pa.MeetingID == m.Key.MeetingID 
         select pa.tl_cr_BlueJeansAccount.DisplayName).ToList() 
    }).ToList(); 
+0

그룹 가입으로이 쿼리를 아주 잘 정리할 수 있습니다. –

+0

@ 코리 넬슨 - 무슨 소리 야? – Aducci

1

gabba가 코드가 실패한 이유를 설명했습니다. 다음은 심지어 Distinct()이 필요하고 그것을보고 조금 청소기하지하는 쿼리를 다시 작동 할 수있는 방법은 그룹을 사용,의 가입 :

from m in crdb.tl_cr_Meetings 
join p in crdb.tl_cr_Participants on new { m.MeetingID, null } 
        equals new { p.MeetingID, p.TimeOut } into meetingParticipants 
select new Meeting 
{ 
    MeetingID = m.MeetingID, 
    MeetingName = m.MeetingName, 
    HostUserName = m.HostUsername, 
    BlueJeansMeetingID = m.tl_cr_BlueJeansAccount.MeetingID, 
    StartTime = m.StartTime, 
    Participants = meetingParticipants 
         .Select(x => x.tl_cr_BlueJeansAccount.DisplayName) 
         .ToList() 
} 
관련 문제