使用LINQ

时间:2017-03-28 12:30:33

标签: c# entity-framework linq

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

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

var query = from ori in db.People
            from dup in db.People                        
            select new DuplicateDataSet
               {
                 ActiveMember = ori,
                 DuplicateMember = dup
               };

if (!string.IsNullOrEmpty(memberFirstName))
     query = query.Where(w => w.ActiveMember.GivenName.Trim() == memberFirstName && w.DuplicateMember.GivenName.Trim() == memberFirstName );
if (!string.IsNullOrEmpty(memberSurname))
     query = query.Where(w => w.ActiveMember.Surname.Trim() == memberSurname && w.DuplicateMember.Surname.Trim() == memberSurname);

query = query.Where(w => w.ActiveMember.PersonID != w.DuplicateMember.PersonID && w.ActiveMember.MemberID != w.DuplicateMember.MemberID);
newList = query.Take(100).ToList();

1 个答案:

答案 0 :(得分:2)

以下是搜索具有相同名称的人的方法:

 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()。 ID中不会有任何重复。例如。如果人们1,2和3具有相同名称​​ John Doe ,那么你将得到

 { 
    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]);
    }
}

测试

GetPermutations(1, 2, 3) // returns (1,2) (1,3) (2,3)

注意:每次从数据库中读取名称时,请考虑将修剪后的值放入数据库,而不是修剪名称。