如何使用linq更新到sql?

时间:2009-11-19 19:32:08

标签: linq-to-sql

我的数据库中有两个表

Class
Student

一个班级有很多学生

使用Linq更新一个班级学生的最佳,更优雅的方法是什么?

5 个答案:

答案 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