2012-01-25 3 views
1

특별히 설계된 뷰에서 렌더링되는 DX gridview가 있습니다. Linq-2-Entities 쿼리에서 값을 채운 미리 정의 된 ViewModel 객체를 전달합니다. 문제는 콜백 함수에서 L2E 쿼리가 필터링, 정렬 및 페이징이 DevExpress 그리드에 의해 수행되기 전에 실제로 DB에서 실행된다는 것입니다. IE : 데이터가보기에 전달되기 전에 쿼리가 실제로 실행이 상황에서DevExpress MVC Gridview + LINQ

public ActionResult GridViewPartial(string myParameters) 
{ 
    var modelData = from s in db.myTable 
            select new { modelName = s.Name }; 

    return PartialView("GridViewPartial", modelData); 
} 

(단순화 된 예는 실제 상황에서 우리는 여러 테이블에서 여전히 하나의 LINQ 쿼리에서 데이터를 선택). 따라서 실제로 DB에서 너무 많은 데이터를 선택하는 반면 gridview는 선택된 페이지 만 표시합니다.

사용자가 선택한 페이지의 데이터 만 선택하도록 어떻게 쿼리를 수정해야합니까? IE. 10 개의 행을 건너 뛰고 설명 된 상황에서와 같이 필터링/정렬/페이징을 적용한 후 100,000 행을 선택하는 대신 사용자가 2 페이지를 선택할 때 L2E 쿼리에서 10을 가져옵니다.

답변

4

MVC의의 GridView 확장이 매우 지원 내부 LinqServerModeDataSource 개체를 통해 기능적으로 "server mode"이라고 표시됩니다.

그것은 데이터 소스로 된 IQueryable 객체가 필요합니다

직접 LINQ 쿼리 다음 LinqToX DataCotnext/클래스에서

http://www.devexpress.com/issue=Q333116

@Html.DevExpress().GridView(...).BindToLINQ(string.Emptry, string.Emptry, (s, e) => { e.KeyExpression = Key_Column_Here; e.QueryableSource = Linq_Query_Here; } 

테이블/뷰;

http://mvc.devexpress.com/GridView/DataBindingToLargeDatabase

@Html.DevExpress().GridView(...).BindToLINQ(Data_Context_Name_Here, Table_View_Name_Here).GetHtml() 
+0

게시 한 첫 번째 URL 인 http://www.devexpress.com/issue=Q333116에는 페이징/정렬/필터링 매개 변수를 사용하기 위해 LINQ 쿼리를 생성하기 위해 자체 로직을 실제로 사용하는 것으로 보이는 예제 프로젝트가 포함되어 있습니다. "기본"linq 쿼리 (IQueryable myLinqObject = dbContext.myTable에서 s)를 만들 수 없으며 gridview에서 데이터베이스 측면에서 쿼리를 실행하기 전에 이러한 매개 변수를 자동으로 추가 할 수 있습니까? 가능하다면 BindToLINQ() 함수는 테이크 (Take), 스킵 (Skip) 등과 같은 액션을 추가로 가정했습니다. – L2Eer

+0

물론입니다. BindToLINQ 메서드를 사용할 때 (앞서 언급 한 두 가지 방법 중 하나) GridView는 해당 LINQ 명령 (Take, Skip 등) 자체를 수행합니다. 즉 수동으로 수행 할 필요가 없습니다. 제공된 코드를 사용하고 SQL Server 프로파일 러를 통해 필요한 쿼리를 확인하십시오. – Mikhail

1

데이터 액세스 레이어/레벨에서 페이징/정렬/필터링을 구현하고 표시해야하는 것만 반환합니다. 눈에 띄는 것처럼 Grid가 올바른 페이지를 표시 할 수 있지만 클라이언트 측에서 발생하고 모든 것이 항상로드되므로 (당신이 XPO ORM을 사용하고 그리드 서버 모드를 사용하는 경우를 제외하고는 데이터베이스에서) (적어도 이것은 윈도우 폼과 ASP.NET 그리드의 개념입니다).

귀하의 질문에 대한 대답은 매개 변수 페이지 크기 및 페이지 인덱스로 받아들이도록 LINQ 쿼리를 설계하고 필요한 특정 pageIndex에서 Take (pageSize)를 수행해야한다는 것입니다. 이 모든 작업은 db의 저장 프로 시저에서 직접 수행 할 수도 있습니다.

+0

나는 비슷한 생각했지만 당신이 수 등의 컬렉션이 전달되는 동안 100 페이지의 최대 만 보유하고있어 그것을 말하는 예를 들어로서, DX의 페이징 매개 변수에 영향을 미치는 경우 내가 모르고 해요 10 개체. 클라이언트 측 DX Gridview 구성 요소는 정렬되는 열과 같은 읽기 가능한 매개 변수도 전달합니까? 더 중요한 것은이 솔루션이 DX의 Gridview 구성 요소를 무의미하게 사용하지 않는가? – L2Eer

3

DevExpress의 gridview가 Linq DB 명령을 효과적으로 사용하려면 개체 유형이 System.Linq.IQueryable이어야합니다. 컨트롤러 내부 로직을 구축하고보기에 LINQ 쿼리를 전달합니다 면도기 내부보기

System.Linq.IQueryable modelData = from s in db.myTable 
           select new { modelName = s.Name }; 

return PartialView("GridViewPartial", modelData); 

명령과 함께있는 gridview를 시작 :

@model System.Linq.IQueryable 
@Html.DevExpress().GridView(...).BindToLINQ((string)null, null, (s, e) => { e.KeyExpression = "Table_id"; e.QueryableSource = Model;})