2013-02-27 4 views
2

말은 (예를 들어, 나는 .... 그렇게 생각하지만) 나는이 (의사 코드) :AsQueryable() 비즈니스 로직 계층 - 나쁜 연습?

순간에 따라서 반환 내 사업을 보장하기 전에 .ToList()를 수행 엔티티 프레임 워크, 내 데이터 액세스 레이어에서

public IEnumerable<User> GetUsers(string name) 논리 계층은 내 데이터 액세스 계층을 간섭 할 수 없습니다.

그러나 비즈니스 로직 계층에서 약간 다른 변형이 필요합니다. 예를 들어 데이터가 더 적게 필요합니다 (예 : 사용자 ID 만 추가하거나 필터링 할 필요가 있음).

효율적인 DB 레이어를 가지려면 데이터의 하위 집합 (오버로드 된 메서드 또는 기타)을 반환하는 다른 메서드가 필요합니다.

그러나 ToString()을 "속이거나"생략 할 수 있으며 내 비즈니스 논리 계층은 AsQueryable()의 끝에 도달합니다. 따라서 비즈니스 로직 계층은 만들어진 기본 SQL을 조작 할 수 있습니다.

비즈니스 로직 계층에서 AsQueryable()에 대한 사람들의 생각은 무엇입니까? 이것이 내 데이터 액세스 레이어를 통해 새는 추상화라고 생각되지만, LINQ 네임 스페이스 (EF 네임 스페이스가 아닌)에 있기 때문에 매우 편리 할 수 ​​있습니다. 사용하는 것이 그리 나쁘지는 않을까요?


EDIT (ToList()를 생략에 대하여 및 인수)을 조심하는 것이 유용

뭔가 코드를 호출하는 경우 이전을 방지하기 위해 즉, 데이터 바인딩에 대한 ToList()에 의존하고 있다는 점이다 오류 "저장소 쿼리 (DbSet, DbQuery, DbSqlQuery)에 직접 바인딩되는 데이터는 지원되지 않습니다." 컴파일 타임 오류가 없으며 런타임 오류 만 발생합니다. 따라서 ToList()가 UI 계층 전에 반드시 호출되는지 확인해야합니다.

+1

나는 일반적으로 Entity Framework *가 * 내 데이터 계층이라는 규칙을 적용합니다. 그 위에 별도의 DAL이 없습니다. 나는 [StackOverflow가 동의 함] (http://blog.stackoverflow.com/2008/09/what-was-stack-overflow-built-with/) (비록 Linq-to-SQL을 사용한다)! –

+2

저장소 패턴을 사용하고 있습니까? – Jehof

+0

좋은 질문입니다. 예, 우리는 다중 점유자 필터링을 수행하기 위해 저장소 패턴을 사용하고 있습니다. –

답변

1

개인적으로 데이터 액세스 레이어에서 ToList()를 수행하는 두 번째 메서드를 추가하고 호출합니다. 그런 식으로 더 깔끔합니다.

아마도 미래에 다른 곳에서 같은 기능을 호출해야 할 것입니다. 한 곳에 보관하십시오.

관련 문제