C# 为什么这个Linq查询不能返回不同的(唯一的)结果?
我有以下疑问:C# 为什么这个Linq查询不能返回不同的(唯一的)结果?,c#,linq,C#,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, Meet
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();
我希望它能带来一份独特会议的清单。出于某种原因,它为每个参与者带回一个条目,即使数据相同:
我是不是错过了一个分组
编辑
会议课程目前非常基础:
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; }
}
您可以使用juharr建议的方式,也可以将comparer作为实现IEqualityComparer接口的单独类实现,并将此comparer传递给distinct
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 ();
}
}
我想您只需要删除代码连接的第3行….这是Linq到实体吗?无论如何,我会删除Distinct并添加一个groupby
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();
我相信每个参与者都有一个条目的原因是您执行了两次联接。 你需要做一个群组加入
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();
gabba解释了代码失败的原因。下面是一种方法,您可以使用组联接重新处理查询,使其不需要特殊的查询,并使其看起来更整洁:
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()
}
你能展示一下会议课的代码吗?它是否实现了IEquatable?您可能希望看到这一点,组加入可以很好地清理此查询。@CoryNelson-您的意思是什么?这里唯一的问题是,我需要加入以检查会议只包含p.TimeOut为空的参与者。这很完美。我以前没见过GroupJoin。我们已经看到了这一点,现在了解了上面的工作原理!太好了,很高兴我能帮忙!