代码之家  ›  专栏  ›  技术社区  ›  Tola

用于插入和删除操作的Linq to SQL泛型类

  •  0
  • Tola  · 技术社区  · 16 年前

    我一直在为插入、更新、删除一次又一次的linq编写相同的代码。我想要一些用于插入、更新、删除操作的通用函数。我读了一篇文章 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编写的用于插入、删除、更新的linq-to-sql泛型类吗?

    谢谢您。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Tola    16 年前

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

    '类GenericCud.vb

    导入System.Linq.Expressions 导入system.data.linq

    公共类泛型

    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)
    

    我在很多博客上读了很多文章。以下是一些真正帮助我使仿制药发挥作用的方法:

    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

    那么,你觉得上面的格内里克德课怎么样?请给我一些意见,因为我想改进它。谢谢您。

        2
  •  0
  •   Randy Minder    16 年前

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

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

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

    兰迪