用于插入和删除操作的LINQ to SQL Generic Class

时间:2009-11-27 07:55:01

标签: vb.net linq-to-sql

我一直在用LINQ编写相同的代码来插入,更新,删除。我想为Insert,Update,Delete操作提供某种通用函数。我读了一篇帖子here,如下所示:

    public static void Insert<T>(T entity) where T : class
{
   using (OrcasDB database = new OrcasDB())
   {
      database.GetTable<T>().Add(entity);
      database.SubmitChanges();
   }
}

public static void Delete<T>(Expression<Func<T, bool>> predicate)
where T : class
{
   using (OrcasDB database = new OrcasDB())
   {
      T instance = (T) database.GetTable<T>().Where<T>(predicate).Single();
      database.GetTable<T>().Remove(instance);
      database.SubmitChanges();
   }
}

How to Use
// insert
Employee will = new Employee
{
   Username = "will.asrari",
   EmailAddress = "me@willasrari.com",
   CanCode = true
};

LinqHelper.Insert<Employee>(will); 

// delete
LinqHelper.Delete(emp => emp.EmployeeId.Equals(3));

是的,我想写一些类似VB.NET的东西。以上代码是否符合要求?任何人都可以向我展示用VB.NET编写的Insert,Delete,Update的LINQ to SQL泛型类吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

仅供参考,我设法编写了一个简单的类来为LINQ to SQL执行通用的CUD操作。

'GenericCUD.vb类

导入System.Linq.Expressions Imports System.Data.Linq

Public Class GenericCUD

Public Shared Sub Insert(Of T As Class)(ByVal theEntity As T)
    Using db As New DemoDataContext()
        db.GetTable(Of T)().InsertOnSubmit(theEntity)
        db.SubmitChanges()
    End Using
End Sub


Public Shared Sub Update(Of T As Class)(ByVal originalEntity As T, ByVal newEntity As T)
    Using db As New DemoDataContext()
        db.GetTable(Of T)().Attach(newEntity, originalEntity)
        db.Refresh(RefreshMode.KeepCurrentValues, newEntity)
        db.SubmitChanges()
    End Using
End Sub

Public Shared Sub Delete(Of T As Class)(ByVal theEntity As T)
    Using db As New DemoDataContext()
        db.GetTable(Of T)().Attach(theEntity)
        db.GetTable(Of T).DeleteOnSubmit(theEntity)
        db.Refresh(RefreshMode.KeepCurrentValues, theEntity)
        db.SubmitChanges()
    End Using
End Sub

结束班

如何使用该课程:

   'Using Insert
    Dim ta As New TestAuthor
    ta.FirstName = TextBox1.Text
    ta.LastName = TextBox2.Text
    GenericCUD.Insert(ta)


   'Using Update
    Dim original As New TestAuthor
    original.Id = 3


    Dim newEntity As New TestAuthor
    newEntity.Id = original.Id
    newEntity.FirstName = TextBox1.Text
    newEntity.LastName = TextBox2.Text

    GenericCUD.Update(original, newEntity)


   'Using Delete
    Dim ta As New TestAuthor
    ta.Id = 7
    GenericCUD.Delete(ta)

我在许多博客上阅读了很多帖子。以下是一些真正帮助我完成GenericCUD的工作:

  1. LINQ, Lambda, and Generics: Insert and Delete
  2. LINQ to SQL CRUD
  3. How to Make LINQ to SQL Check for Changes After Attach
  4. 那么,您如何看待上面的GernericCUD类?请给我一些评论,因为我想改进它。谢谢。

答案 1 :(得分:0)

我们在3层应用程序框架中采用了类似的方法。我们目前有大约80个实体,并使用泛型来创建一组非常轻量级的通用CRUD方法,这些方法可以满足那80个实体和任意数量的实体。

我可能提出的唯一建议是重新考虑为每个插入,更新和删除操作创建新数据库上下文的方法。问题是如果您需要在单个事务中包装多个插入,更新和/或删除,您将需要使用TransactionScope对象,因为每个插入/更新/删除都使用它自己的上下文对象。使用TransactionScope是可以的,但由于你有多个连接,事务将升级为MTC事务,这是一个麻烦。

无法帮助您使用VB代码。 IMO,学习并坚持使用C#。

兰迪