2011-08-16 2 views
1

새 프로젝트를 사용하고 있으며 저장소 계층에서 작업하고 있습니다. 이것은 저장소 패턴을 사용하는 제 2 프로젝트입니다. Scott Millett의 저서를 읽었습니다. Professional ASP.NET 디자인 패턴 Scott은 책에서 사례 연구를 참조하면서 그의 저장소 인터페이스에서 Query Object Pattern을 사용했습니다. 이전 프로젝트에서이 목적으로 LINQ를 사용했는데 잘 작동했습니다.쿼리 개체 패턴 대 LINQ

내 질문은 다음과 같습니다. 쿼리 개체 패턴 구현을 사용하는 것과 장내에서 LINQ를 사용하는 것에 대한 장단점은 무엇입니까?

1. 쿼리 개체 패턴 방식

public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot 
{ 
    T FindBy(TId id); 
    IEnumerable<T> FindAll(); 
    IEnumerable<T> FindBy(Query query); 
} 

2. LINQ 접근

public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot 
{ 
    T FindBy(TId id); 
    IQueryable<T> FindAll(); 
    IQueryable<T> FindBy(Expression<Func<T, bool>> query); 
} 

어떤 기여 :

다음은 2 개의 다른 접근 방식을 설명 2 개 시나리오입니다 도움이 될 것입니다.

+0

IMHO, 표현 트리는 쿼리 개체 패턴의 특별한 형태입니다. –

답변

1

LINQ의 표현식 트리는 유연성이 뛰어나므로 쿼리 개체 패턴의 특수한 형태라고 생각하지만 런타임시에만 볼 수있는 버그를 소개 할 수 있습니다. 나는 C# 코드가 표현식 트리로 성공적으로 변환되었지만이를 SQL로 변환해야하는 공급자는 이해하지 못한다고 이야기하고 있습니다.

예 :

var a = new SpecialObject(); 
yourRepository.FindBy(x => a.IsCorrect(x)); 

이 같은 오류가 일반 쿼리 객체 불가능하다.

+0

Daniel, 내 이해를 확인하기 위해 LINQ의 유연한 특성으로 인해 코드가 컴파일되는 시나리오가 생길 수 있다고 말하는 것이 맞지만 실제로 유효하지 않습니다. – Ozzy

+0

예, 가장 확실합니다! 많은 사례 중 하나를 보려면 [여기] (http://stackoverflow.com/questions/1920775/why-would-entity-framework-not-beable-to-use-tostring-in-a-linq-statement)를 참조하십시오. . –

+0

또는 [google] (http://www.google.com/search?hl=ko&q=%22LINQ+to+Entities+does+not+recognize+the+modod+%27%2A%27+method%2C+ and + this + method +는 + a + store + expression으로 변환 될 수 없습니다. % 22 & oq = % 22LINQ + to + 엔티티 +는 + 메소드 + % 27 * % 27 + 메소드 % 2C +를 인식하지 않습니다 + + this + method +는 + a + store + expression. % 22 & aq = f & aqi = & aql = & gs_sm = e & gs_upl = 3041l3041l0l5273l1l1l0l0l0l0l0l0l0l0l0l0)에 이와 같은 경우에 발생하는 예외 메시지를 변환 할 수 없습니다. –