2016-10-27 2 views
-2

가정하자이 같은 도메인 모델이 : 나는 뷰 모델은 일부 필드를 제외 할가장 좋은 방법은

public class Book 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Author { get; set; } 
    public DateTime PublicationDate { get; set; } 
    public DateTime EntryDate { get; set; } 
    public string EnteredBy { get; set; } 
} 

그러나, 다음과 같습니다 :

public class BookView 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Author { get; set; } 
    public DateTime PublicationDate { get; set; } 
} 

있다 데이터베이스에서 뷰 모델을 가져 오는 두 가지 방법. 첫 번째 방법은 이것이다 :

List<BookView> views = context.Books.Where(b=>b.Author=="Winston Churchill") 
    .Select(b=>new BookView() { ID=b.ID,Title=b.Title,Author=b.Author,PublicationDate=b.PublicationDate}) 
    .ToList(); 

을하고, 두 번째 방법은 이것이다 :

var results = context.Books.Where(b => b.Author == "Winston Churchill"); 
List<BookView> views = new List<BookView>(); 
foreach(var b in results) 
{ 
    views.Add(new BookView() { ID = b.ID,Title = b.Title,Author = b.Author,PublicationDate = b.PublicationDate});   
} 

내 질문 성능 문제의 모든 차이는 무엇입니까? 후자는 더 많은 레이어 분리를 허용합니다. 예를 들어 Book 모델은 뷰 모델을 전혀 참조하지 않는 별도의 Data 어셈블리에있을 수 있습니다. 그러나 Select 절이 쿼리를보다 효율적으로 만드는 지 궁금합니다.

+0

첫 번째 방법은 조건이 일치하지 않으면 예외를 throw합니다. 두 번째는 목록이 null인지 항상 확인할 수 있습니다. 성능은별로 중요하지 않습니다. 'foreach' 대신'for' 루프를 사용하는 것이 좋습니다. 대규모 컬렉션의 경우 조금 빠릅니다. –

+0

@Cristian Szpisjak 어떤 예외가 발생합니까? 이 코드를 시도 할 때 예외가 발생하지 않습니다. – astidham2003

+0

@Matthew 당신은 프로파일 링이나 어떤 유형의 성능 테스트를 해 보았습니까? 각각의 경우에 생성 된 SQL을 살펴 보았습니까? – astidham2003

답변

2

"선택"절을 사용하면 더 효과적입니다. 선택은 IQuerable 객체이기 때문에 데이터베이스에서 직접 수행되므로 선택 영역의 필드 만 쿼리 할 수 ​​있습니다. 다른 방법으로, 모든 열을 쿼리하고 메모리에서 조작합니다.

+0

퍼포먼스라는 단어가 확실하지 않습니다. 비록 내가 대답을 – Fran

+0

performital에 동의하면 더 나은 수행을 의미한다. – Stormhashe

+0

그 단어는 존재하지 않는다. 나는 당신이 연기자를 찾고 있다고 생각합니다. 그리고 그것도 조심성이 있습니다. http://english.stackexchange.com/questions/38945/what-is-wrong-with-the-word-performant – Fran