2009-08-10 4 views
1

linq-to-SQL 또는 nhibernate 구현간에 스왑 수 있도록 내 db 계층을 디자인하는 경우 인터페이스에 대해 코드를 작성해야합니다.linq 및 nhibernate는 동일한 유형의 컬렉션을 반환합니까?

이것은 LINQ와 NHibernate에 양의 리턴 유형이 동일, 즉 명부 등

리스트는 동일한 타입 일 필요 수단?

+2

IMO 당신은 ORM을 추상화하는 것보다 하나 따기가 더 낫습니다. – anonymous

답변

0

NHibernate는 콜렉션에 대해 기본적으로 IList를 반환하며, 안타깝게도 많은 linq 표현식이 작동하지 않습니다. NHibernate 리턴 타입을 변경하는 방법이 있는지는 잘 모르겠다.

2

리포지토리 패턴을 사용하여 데이터베이스 액세스를 캡슐화하는 경우 리포지토리에서 공용 인터페이스를 구현하고 메서드에서 반환 형식으로 사용하도록 선택한 형식 (예 : IEnumerable (T) 또는 IList)을 반환하도록 할 수 있습니다 (티).

IList (T)는 IEnumerable (T)을 구현하므로 그 방향에 문제가 없습니다. IEnumerable (T)가있는 경우 IEnumerable (T)의 ToList() 확장 메서드를 사용하여 List (T)를 가져올 수 있습니다. IQueryable (T) IEnumerable (T) ToList() 잘 경우에도 작동합니다. 이 같은

뭔가 : 당신이 (저장소 패턴을 사용하여) LINQ 쿼리 함축하지 않고 DB를 레이어를 사용 싶어하지 않는

public interface IFooRepository 
{ 
    IList<Foo> GetAll(); 
    // ... 
} 

public class NHibernateFooRepository : IFooRepository 
{ 
    //... 

    public IList<Foo> GetAll() 
    { 
     return Session.CreateCriteria(typeof(Foo)).List<Foo>(); 
    } 
} 


public class LinqToSqlFooRepository : IFooRepository 
{ 
    //... 

    public IList<Foo> GetAll() 
    { 
     var foos = from Foo f in context.Foos select f; 
     return foos.ToList(); 
    } 
} 
1

IIRC는, 당신은 NHibernate에에 LINQ를 살펴한다 이 경우 거의 대부분의 시간을 번역해야하는 IQueryable<T> 결과에 대해 코드를 작성할 수 있습니다.

그러나 엔티티 형식의 1- * 관계는 기본적으로 동일한 형식을 공유하지 않습니다 (LINQ-1의 경우 일반적으로 EntitySet<T>입니다. to-SQL, 그리고 NHibernate에서 IList<T>), LINQ-to-SQL과 Hibernate가 그러한 관계에 대해 IList<T> 또는 IEnumerable<T>을 사용하도록 강제 할 수 있다면, 이것도 잘 작동 할 것입니다.

컴파일 타임 호환성이있는 경우에만 일반 콜렉션을 고수하는 한 다양한 콜렉션 유형을 구분해서는 안됩니다. 예를 들어, NHibernate 매핑이 IList<T>이고 LINQ-to-SQL이 EntitySet<T>을 사용하는 경우 IList<T> 메서드를 사용하면 안전 할 것입니다.

각 프레임 워크의 느슨하고 열정적 인로드 차이에주의하십시오.

관련 문제