我的数据库中有两个表
Class
Student
一个班级有很多学生
使用Linq更新一个班级学生的最佳,更优雅的方法是什么?
答案 0 :(得分:2)
DataContext dc = new DataContext();
foreach(var student in dc.Students.Where(SomeCondition))
{
student.SomeField = SomeValue;
student.SomeOtherField = SomeOtherValue;
}
dc.SubmitChanges();
答案 1 :(得分:1)
如果您使用的是LINQ to SQL,那么您的Class Linq类应该有一个Students集合。
您应该能够使用简单的foreach循环更新它们。完成更新后,只需在数据上下文中调用SubmitChanges()。
答案 2 :(得分:0)
Linq无法进行批量更新,因此您必须选择要更新的学生,对其进行迭代,更新字段,然后提交数据上下文的更改。
(已经有一些尝试让批处理更新正常工作,例如this,但微软并没有正式支持它。)
答案 3 :(得分:0)
正如他们所说,批量更新不是(轻松)可能的,因此迭代每个学生并一次更新一个可能是最好的解决方案。
This article确实提出了批量更新的方法,但它看起来比它的价值更麻烦。
答案 4 :(得分:0)
假设您的Class和Student表都有一个时间戳字段Modified,您可以试试这个:
Public Class ClassesConduit
Public Function SaveClasses(ByVal theseClasses As IEnumerable(Of [Class])) As Boolean
SaveClasses = False
Dim newClasses = theseClasses.Where(Function(c) c.Modified Is Nothing)
Dim updatedClasses = theseClasses.Where(Function(c) c.Modified IsNot Nothing)
Using db As New ClassesDataContext
db.DeferredLoadingEnabled = False
db.Classes.InsertAllOnSubmit(newClasses)
db.Classes.AttachAll(updatedClasses, True)
SaveStudents(theseClasses.SelectMany(Function(c) c.Students), db)
SaveClasses = (db.GetChangeSet.Inserts.Count + db.GetChangeSet.Updates.Count) > 0
Try
db.SubmitChanges()
Catch ex As Exception
Throw
End Try
End Using
End Function
Private Sub SaveStudents(ByVal theseStudents As IEnumerable(Of Student), ByRef db As ClassesDCDataContext)
Dim newStudents = theseStudents.Where(Function(s) s.Modified Is Nothing)
Dim updatedStudents = theseStudents.Where(Function(s) s.Modified IsNot Nothing)
db.Students.InsertAllOnSubmit(newStudents)
db.Students.AttachAll(updatedStudents, True)
End Sub
End Class