Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Distinct()删除主键为的数据库中的重复行_C#_Sql Server_Linq_Entity Framework - Fatal编程技术网

C# 使用Distinct()删除主键为的数据库中的重复行

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

我的数据库中有一些重复的值,所以我使用LINQtoEntity删除它们,代码如下。问题在于,
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);