C# 使用LINQ在表中查找类似记录

C# 使用LINQ在表中查找类似记录,c#,entity-framework,linq,C#,Entity Framework,Linq,我试图在一个表中查找同名姓氏的人,到目前为止,我已经编写了这个LINQ查询。这个查询给我一个交叉连接结果。有人能帮我删除类似的结果集吗? 我想在网格中显示匹配的记录,用户可以打开每个记录的详细信息,看看它们是否真的重复,然后对其采取行动 对于eg 考虑一个人的身份证号码 目前的结果是 (1,2) (1,3) (2,1) (2,3) (3,1) (3,2) 我希望结果是(1,2) (1,3) (2,3) 以下是您应该如何搜索同名人员: from p in db.People group p b

我试图在一个表中查找同名姓氏的人,到目前为止,我已经编写了这个LINQ查询。这个查询给我一个交叉连接结果。有人能帮我删除类似的结果集吗?
我想在网格中显示匹配的记录,用户可以打开每个记录的详细信息,看看它们是否真的重复,然后对其采取行动

对于eg
考虑一个人的身份证号码 目前的结果是 (1,2) (1,3) (2,1) (2,3) (3,1) (3,2)
我希望结果是(1,2) (1,3) (2,3)


以下是您应该如何搜索同名人员:

 from p in db.People
 group p by new { GivenName = p.GivenName.Trim(), Surname = p.Surname.Trim() } into g
 where g.Count() > 1 // this condition filters out people without duplicates
 select new {
    Name = g.Key,
    Duplicates = g.ToList()  // here you will get people with same name
 }
如果您只想获取重复人员的ID,可以使用
Duplicates=g.Select(p=>p.PersonID).ToList()
。ids中不会有任何重复。例如,如果第1、2和3个人的名字都是约翰·多伊,那么你将得到

 { 
    Name: { GivenName: "John", Surname: "Doe" },
    Duplicates: [1, 2, 3]
 }
如果需要,您可以使用这些ID进行任何排列。例如,您可以使用两个循环:

private static IEnumerable<Tuple<T,T>> GetPermutations<T>(params T[] values)
{
    for (int i = 0; i < values.Length - 1; i++)
    {
        for (int j = i + 1; j < values.Length; j++)
            yield return Tuple.Create(values[i], values[j]);
    }
}

注意:每次从数据库中读取名称时,不要考虑修剪名称,而是考虑将修剪值设置为数据库。为什么预期结果仍然包含重复项
1,2 1,3 2,3
?这些数字可以被视为个人id。我想将它们全部显示在一个网格中,用户可以打开每个数字的详细信息,查看它们是否真的重复,然后采取行动。谢谢,我将尝试
private static IEnumerable<Tuple<T,T>> GetPermutations<T>(params T[] values)
{
    for (int i = 0; i < values.Length - 1; i++)
    {
        for (int j = i + 1; j < values.Length; j++)
            yield return Tuple.Create(values[i], values[j]);
    }
}
GetPermutations(1, 2, 3) // returns (1,2) (1,3) (2,3)