2010-02-16 8 views
0

Linq를 사용하여 데이터베이스를 쿼리하고 결과 IQueryable을 DataGrid에 바인딩하는 페이지를 작성했습니다. 데이터베이스에서 가져온 다른 값을 기반으로 값을 파생시키는 추가 속성이 포함 된 부분 클래스가 있습니다.파생 된 필드를 기반으로 Linq 객체의 gridview를 정렬하려면 어떻게해야합니까?

정렬은 데이터베이스에 실제로 있지만 파생 필드에는없는 필드에서 잘 작동합니다. 나는 그런 필드를 정렬하려고 할 때 나는 멤버 'Trip.Difference는'SQL에 지원되는 변환이 없습니다 "라는 오류가 발생합니다.

이 파생 필드를 정렬 할 수있는 방법을 어떤 생각?

답변

0

문제 당신이 그렇게 당신이 그것을 열거 할 때마다, 당신은 SQL 문에 IQueryable에 LINQ 식을 번역하고 그것을 실행하기 위해 데이터베이스에 다시가는 IQueryable에 결합되어 있다는 점이다.

당신이 정렬하려는 경우 데이터베이스 모델에 바인딩되지 않은 속성은 언급 된 오류를 가져옵니다. 객체가 dat에서 만들어지면 해당 속성 만 존재하기 때문에 행.

가장 간단한 해결책은 정렬 및 데이터 바인딩에 사용하기 전에 IQueryable에서 ToList()을 호출하여 속성을 실제로 사용할 수있는 메모리 내 개체를 정렬 할 수 있도록하는 것입니다. ToList()은 (List<T>을 통해) IQueryableIEnumerable으로 변환하고 LINQ to SQL을 통해 데이터베이스로 다시 이동하지 못하도록합니다.

이것은 일반적으로 좋은 디자인 패턴입니다. 마지막으로 IQueryable을 반환 했으므로 IEnumerable을 반환했기 때문에 비즈니스 계층의 소비자가 무의식적으로 데이터베이스에 대해 임의의 쿼리를 실행할 수 있습니다.

0

전화 ToEnumerable()를 먼저하고있는 OrderBy을 추가

var q = (from a in mDataContext.Somethings() 
     select a).ToEnumerable().OrderBy... 
+0

호출 .ToEnumerable는 객체 데이터베이스에서 읽을 수 일으킬 것인가? 테이블에는 600,000 개의 레코드가 있으며 페이징이 적용될 때까지 검색하지 않는 것이 좋습니다. – DJCasey

관련 문제