C# 使用Distinct()删除主键为的数据库中的重复行
我的数据库中有一些重复的值,所以我使用LINQtoEntity删除它们,代码如下。问题在于,C# 使用Distinct()删除主键为的数据库中的重复行,c#,sql-server,linq,entity-framework,C#,Sql Server,Linq,Entity Framework,我的数据库中有一些重复的值,所以我使用LINQtoEntity删除它们,代码如下。问题在于,RosterSummaryData\u Subject\u Local中有一个自动编号主键,它使行var distinctRows=allRows.Distinct()无效 因此,即使所有行都相同,distinct也不起作用,因为pk不同。是否有任何理由怀疑pk的独特性?或者从查询中删除它,使其成为非问题。请注意,我希望查询返回实体类型的IQueryable,这样我就可以使用entity上的RemoveR
RosterSummaryData\u Subject\u Local
中有一个自动编号主键,它使行var distinctRows=allRows.Distinct()无效代码>
因此,即使所有行都相同,distinct也不起作用,因为pk不同。是否有任何理由怀疑pk的独特性?或者从查询中删除它,使其成为非问题。请注意,我希望查询返回实体类型的IQueryable,这样我就可以使用entity上的RemoveRange()
方法来删除重复项
var allRows = (from subjLocal in customerContext.RosterSummaryData_Subject_Local
select subjLocal);
var distinctRows = allRows.Distinct();
if (allRows.Count() == distinctRows.Count())
{
return;
}
else
{
var rowsToDelete = allRows.Where(a => a != distinctRows);
customerContext.RosterSummaryData_Subject_Local.RemoveRange(rowsToDelete);
}
编辑
我意识到要正确地返回不同的行,我所要做的就是选择除主键之外的所有项目:
var distinctRows = allRows
.Select(a => new {a.fkRosterSetID, a.fkTestInstanceID, a.fkTestTypeID,
a.fkSchoolYearID, a.fkRosterTypeID, a.fkDistrictID,
a.fkSchoolID, a.fkGradeID, a.fkDepartmentID,
a.fkCourseID, a.fkPeriodID, a.fkDemoCommonCodeID,
a.fkDemoCommonCategoryID, a.fkTest_SubjectID})
.Distinct();
问题是我无法使用下面的代码获取重复的行,因为!运算符不使用匿名类型(变量distinctRows是匿名类型,因为我没有选择所有列):
有什么帮助吗?也许您需要检查customerContext.RosterSummary Data\u Subject\u Local中的每个字段,看看哪一个不同您可以尝试以下方法:
var allRows = (from subjLocal in customerContext.RosterSummaryData_Subject_Local
select subjLocal).ToList();
var distinctRows = allRows.Distinct().ToList();
由于您将处理列表对象,因此在原始else语句中可以执行以下操作:
else
{
var rowsToDelete = allRows.Where(a => !distinctRows.Contains(a));
customerContext.RosterSummaryData_Subject_Local.RemoveRange(rowsToDelete);
}
要处理数据库中Distinct()和autonumberID的问题,我可以想到两种解决方案
一个是你可以带进MoreLinq库,这是一个Nuget包。然后可以使用MoreLinq方法DistinctBy():
或者另一种方法是将IEqualityComparer与常规的.Distinct()Linq方法一起使用。有关在.Distinct()方法中使用IEqualityComparer的更多信息,请查看此SO问题 你为什么要用LINQ写这个?在纯SQL中非常简单。@dbugger这个过程需要在我的程序中发生多次。我会使用一些通用的ADO.NET来完成它吗?是的。SQL字符串。执行命令,开始你的一天。不需要和EF战斗。
else
{
var rowsToDelete = allRows.Where(a => !distinctRows.Contains(a));
customerContext.RosterSummaryData_Subject_Local.RemoveRange(rowsToDelete);
}
allRows.DistinctBy(a => a.SomePropertyToUse);