我试图在一个表中找到具有相同名称和姓氏的人,到目前为止我已经编写了这个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();
答案 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)
注意:每次从数据库中读取名称时,请考虑将修剪后的值放入数据库,而不是修剪名称。