1

SQL Server 2008 db에 Orders라는 테이블을 만들었습니다. 이 테이블에는 dateCreated 유형의 Date, CustomerId, InvoiceTypeId, InvoiceId 등이 포함 된 열이 있습니다. 또한 Invoice, Customer 및 InvoiceType 테이블이 있습니다.MVC3 및 ADO.NET 엔터티 데이터 모델을 사용하여 데이터 필터링

내 MVC3 비주얼 스튜디오 프로젝트에서 나는 내가 관심이있는 단지 몇 열을 선택, 함께 모든 테이블을 조인 내 데이터베이스에서보기.

을 만든 내가 ADO.NET을 만들었습니다 db 뷰를 나타내는 엔티티 데이터 모델입니다. 나는 또한 아주 간단한 컨트롤러를 만들었습니다. 마지막으로 WebGrid를 사용하여 주문을 표시하는 면도기 뷰를 만들었습니다. 그것은 잘 작동합니다.

이 방법이 합리적입니까?

이제 면도기 페이지에 WebGrid의 내용을 필터링하는 데 사용할 수있는 시작 날짜와 종료 날짜를 추가 할 수있게하려면 어떻게해야합니까?

나는 이것을 수행하는 두 가지 방법이 있다고 생각합니다.

  1. 모든 데이터를 db 뷰에서 엔터티 모델로로드하십시오. 그런 다음 필터링 코드가 면도기 코드에 추가 될 것입니다. 모든 데이터가 이미 모델에 있으므로 필터가 변경 될 때마다 db를 읽지 않아도됩니다.

  2. 처럼 데시벨보기로 뭔가를 몇 가지 추가 SQL 코드를 추가 WHERE (@StartDate 및 @EndDate 간의 dateCreated) 후 DB에서 우리는 필터를 변경할 때마다 읽어 모델을 가지고있다. Orders 테이블에 많은 양의 레코드가 있고 일반적으로 지난 주 또는 며칠을 보려는 경우에만 유용합니다. 이것이 MVC3 접근법과 관련이 있습니까? 어떻게 할 수 있습니까?

답변

2

나는 당신의 접근 방식을 권장하지 않습니다. 데이터베이스 뷰는 유일한 프로젝션입니다. LINQ로 프로젝션을 할 수 있습니다. LINQ를 사용하면 다양한 계획을 세울 수 있으며 유지 관리가 쉽습니다.

1) db 뷰의 모든 데이터를 엔티티 모델로로드하십시오. 그런 다음 필터링 코드가 면도기 코드에 추가 될 것입니다. 모든 데이터 은 이미 모델에 있으므로 필터를 바꿀 때마다 을 읽을 필요가 없습니다.

권장되는 방법은 필터 조건과 표시 할 열을 기반으로 LINQ 쿼리를 작성하는 것입니다. 필터링은 데이터베이스에서 수행됩니다. 데이터베이스가 최선을 다해서 (필터링) 할 수있게하고, Razor가 자신이 잘하는 일을하도록합니다 (프리젠 테이션).

2) 데시벨보기로 다음 @StartDate 및 @EndDate) 간의 (dateCreated 모델 는 DB에서 우리는 필터를 변경할 때마다 읽게 WHERE 같은 것을 몇 가지 추가 SQL 코드를 추가합니다. 주문 테이블에 많은 양의 레코드가 있고 우리는 보통 지난 주 또는 며칠을 보려고 만하는 입니다. MVC3 방식으로이 작업을 수행 할 수 있습니까? 어떻게 할 수 있습니까?

다시 날짜 필터는 LINQ를 사용하여 적용 할 수 있으며 필터링은 데이터베이스에서 수행됩니다.

샘플 코드

var query = db.Invoices; 

if (!string.IsNullOrWhiteSpace(model.CustomerName)) 
{ 
    query = query.And(i => i.Customer.Name.StartsWith(model.CustomerName)); 
} 

if (model.InvoiceTypeId != null) 
{ 
    query = query.And(i => i.InvoiceTypeId == model.InvoiceTypeId.Value); 
} 

return query.Select(i => new InvoiceDto { i.Amount, Customer = i.Customer.Name });