2014-11-24 58 views
0

在主數據庫中刪除重複的行我的數據庫中有一些重複的值,所以我使用Linq to Entity以下面的代碼刪除它們。問題是在RosterSummaryData_Subject_Local中有一個自動編號主鍵,這會使行無效var distinctRows = allRows.Distinct(); 因此,即使所有行都相同,但由於pk不同,所以不同行將不起作用。無論如何可以詆譭獨特的pk?或者無論如何,從查詢中刪除它,所以它成爲一個問題。只是爲了說明我希望查詢返回實體類型的IQueryable,因此我可以在物體上使用RemoveRange()方法來刪除重複項。使用Distinct()

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是匿名類型,因爲我沒有選擇所有列):

var rowsToDelete = allRows.Where(a => a != distinctRows); 

任何幫助?

+0

你需要在LINQ中寫這個的任何理由?在直接SQL中非常簡單。 – dbugger 2014-11-24 02:17:52

+0

@dbugger這個腳本需要在我的程序中多次出現。我會用一點通用的ADO.NET來完成它嗎? – frontin 2014-11-24 02:28:03

+0

是的。 SQL字符串。 cmd.Execute,去你的一天。無需與EF戰鬥。 – dbugger 2014-11-24 02:30:08

回答

0

你可以試試這個:

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

要以鮮明的()和autonumberID在數據庫中處理您的問題,我可以想到兩種解決方案。

一個是你可以攜帶MoreLinq庫,它是一個Nuget包。然後你可以使用MoreLinq方法DistinctBy():

allRows.DistinctBy(a => a.SomePropertyToUse); 

或者其他途徑將使用的IEqualityComparer與常規.Distinct()LINQ的方法。你可以查看這個SO問題,以獲得更多有關在.Distinct()方法中使用IEqualityComparer的信息。 using distinct with IEqualityComparer

0

也許你需要檢查該字段中的每一個在你的customerContext.RosterSummaryData_Subject_Local,看看哪一個是不同