我在資料庫中有一個學生表。我正在嘗試向其中添加新資料。
我獲取了一個記憶體中的學生串列,檢查這些記錄是否已經存在于資料庫中。如果db中至少有一條記錄不存在,我會添加它。
我嘗試了幾種方法,其中一些有效。但是,它不是最優的。我嘗試了什么:
- 從 db 中獲取每條記錄并一一比較。
- 從記憶體串列中取出每條記錄并查詢資料庫以檢查是否有相關記錄。
他們倆都很壞。現在我嘗試了一個看起來更優化的解決方案,但我無法讓它發揮作用。
List<Student>? inMemoryStudents = GetStudents();
List<Student>? existingStudentsFromDb = myDbContext.Students.Where(u => inMemoryStudents.Contains(u)).ToList();
IEnumerable<Student> newStudents = inMemoryStudents.Except(existingStudentsFromDb);
myldcDbContext.Students.AddRange(newStudents);
除了不起作用。例子:
如果我有 30 名學生inMemoryStudents并且所有 30 名學生都存在于 db 中,我仍然會在newStudents變數中獲得所有 30 條記錄。
uj5u.com熱心網友回復:
LINQ 方法使用物件的Except相等方法來確定它們是否相同。默認情況下,大多數 C# 物件只有在它們是完全相同的記憶體物件時才會被視為“相等”。
嘗試使用 ID 而不是比較整個 Student 物件。
List<Student> inMemoryStudents = GetStudents()!;
List<int> inMemoryStudentIds = inMemoryStudents.Select(i => i.Id).ToList();
HashSet<int> existingStudentIdsFromDb = myDbContext.Students
.Where(u => inMemoryStudentsIds.Contains(u.Id))
.Select(u => u.Id)
.ToHashSet();
IEnumerable<Student> newStudents = inMemoryStudents
.Where(s => !existingStudentIdsFromDb.Contains(s.Id));
myldcDbContext.Students.AddRange(newStudents);
除了解決平等問題之外,這還具有僅向資料庫發送和接收整數的優點,而不是您并不真正需要的所有學生資料。
uj5u.com熱心網友回復:
除了取兩個串列的集合差。為了確定有什么不同,將應用一個相等運算子。由于從資料庫回傳的串列將是與記憶體中不同的物件(盡管具有相同的屬性和值),因此它永遠不會回傳 true。
一個可能的解決方案是覆寫== operator并使其檢查每個單獨的屬性和/或僅使用StudentID/ID欄位(假設有這樣的欄位)
uj5u.com熱心網友回復:
您想保存學生的 ID 不在資料庫中。因此,只需檢查 MemoryStudents 串列中沒有 StudentStudentsFromDb 串列中的 ID。
List<Student> newStudents = inMemoryStudents.Where( i => !existingStudentsFromDb.Select(item=>item.Id).Contains(i.Id)).ToList();
關于 existingStudentsFromDb 串列,您可以使用僅回傳 Ids 的其他方法。所以你可以像這樣更改上面的代碼:
List<Student> newStudents = inMemoryStudents.Where( i => !existingStudentsFromDb.Contains(i.Id)).ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494219.html
