2009-11-27 3 views
0

LINQ를 반복해서 삽입, 업데이트, 삭제할 때 동일한 코드를 작성했습니다. 삽입, 업데이트, 삭제 작업을위한 일종의 일반적인 함수를 갖고 싶습니다. 나는 다음과 같은 게시물 here을 읽어삽입 및 삭제 작업을위한 LINQ to SQL 일반 클래스

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 = "[email protected]", 
    CanCode = true 
}; 

LinqHelper.Insert<Employee>(will); 

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

예, VB.NET에서 뭔가를 쓰고 싶습니다. 따라 가기 좋은 코드인가? 누구든지 VB.NET으로 작성된 Insert, Delete, Update에 대한 SQL 일반 클래스에 대한 LINQ를 보여 줄 수 있습니까?

감사합니다.

+0

dll에서 C# 버전을 유지하고 VB에서 단순히 참조하는 것을 고려한 적이 있습니까? –

+0

당신의 제안은 해결책이 될 수 있습니다. 그러나 나는 그것을 배우기 때문에 VB.NET 코드를 작성하려고합니다. 비록 C#을 VB.NET으로 변환하는 몇 가지 도구를 사용할 수 있지만, 여전히 SOF에서 몇 가지 답변과 의견을보고 싶습니다. –

답변

1

는 참고로, 나는 SQL에 LINQ에 대한 일반 CUD의 operantion을 할 수있는 간단한 클래스를 작성 관리.

'클래스 GenericCUD.vb

수입 System.Linq.Expressions 수입 System.Data.Linq

공공 클래스 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

그래서, 위의 GernericCUD 클래스에 대해 어떻게 생각하십니까를? 내가 그것을 개선하고 싶기 때문에 나에게 약간의 코멘트를 줘. 고맙습니다.

0

3 계층 응용 프로그램 프레임 워크에서 비슷한 접근 방식을 취했습니다. 우리는 현재 약 80 개의 엔티티를 가지고 있으며 80 개 엔티티와 여러 엔티티를 포함하는 매우 가벼운 일반 CRUD 메소드 세트를 생성하기 위해 제네릭을 사용했습니다.

삽입, 업데이트 및 삭제 작업마다 새 데이터베이스 컨텍스트를 만드는 방법을 다시 생각해보십시오. 문제는 단일 트랜잭션에서 여러 삽입, 업데이트 및/또는 삭제를 래핑해야하는 경우 각 삽입/업데이트/삭제가 자체 컨텍스트 개체를 사용하기 때문에 TransactionScope 개체를 사용해야한다는 것입니다. TransactionScope 사용은 괜찮지 만 여러 연결을 가지고 있기 때문에 트랜잭션이 MTC 트랜잭션으로 상승하게되어 번거 롭습니다.

VB 코드를 도와 드릴 수 없습니다. IMO, 배우고 C#을 고수하십시오.

는 랜디

+0

Randy, C#에서 한 일을 볼 수 있을까요? 감사. –