2013-12-17 3 views
3

내가 가지고있는 LINQ 가입 다음오류 <>

var query = _ABC.Table 
      .Join(_DEF.Table, cef => ...etc... }) 
      .Join(_GHI.Table, extf => ...etc...}) 
      .Select(jcefn=> new { XYZ = jcefn....etc...}); 

LINQ가 좋은 내가 (LINQ 패드에서 확인) 무엇을 기대 반환합니다.

public PagedList(IQueryable<T> source, int pageIndex, int pageSize) 
{ ... } 

그래서 나는이 허용 될 것이라고 생각 :

는 내가이 서명 확장 방법으로 쿼리를 전달하는 데 노력하고

var FPaged = new PagedList<MyObject>(query.ToList(), pageIndex, pageSize); 

그러나 그것은 분명히을하지 않습니다 컴파일러 행복. 말하고있다 :

인수 1 : 내 LINQ 익명 형식을 변경해야하지만 정확히 확인하지 그러니 확실히 System.Linq.IQueryable 등 '에'System.Collections.Generic.List '에서

을 변환 할 수 없습니다 무엇을 바꿀까요?

참고 간결성을 위해 이해할 필요가 없다고 생각하는 코드가 많았지 만 필요한 경우이를 기꺼이 편집 할 것입니다.

고마워요

+2

쿼리에서 ToList()를 호출하지 마십시오. IQueryable에서 List로 캐스팅 할 수 없다는 불만이 있습니다. –

+0

오른쪽 ?? 글쎄 그게 내가 먼저 한 일이고 그것은 내게 말했다 : 'System.Linq.IQueryable '에서 'System.Linq.IQueryable'로 변환 할 수 없다 ' – GPGVM

답변

2

PagedList에는 IQueryable<MyQuery>이 필요합니다. 조회 오브젝트의 유형은 IQueryable<anonymous-type>입니다.

var query = _ABC.Table 
      .Join(_DEF.Table, cef => ...etc... }) 
      .Join(_GHI.Table, extf => ...etc...}) 
      .Select(jcefn=> new MyObject(){ XYZ = jcefn....etc...}); 

당신은()을 IQueryable이 점을 설정하는 .ToList 필요하지 않습니다, 그것은 이미 : 당신이 당신의 선택을 변경해야 IQueryable<MyQuery>를 얻으려면. 당신이 함수에 전달하기 전에 IQueriable을 실행하고 캐시 할 경우

그러나, 당신이 당신이 원하는되지 않습니다 경우

var cachedQuery = query.ToList(); 
var FPaged = new PagedList<MyObject>(cachedQuery.AsQueryAble<MyObject>(), pageIndex, pageSize); 

을 할 수 있습니다.PagedList는 특정 페이지에 현재 필요한 데이터의 일부만 검색하고 데이터베이스의 쿼리 뒤에 잠재적으로 거대한 데이터 집합의 나머지 부분을 남기 때문에 IQueryable이 가장 필요합니다.

그러나 실제로 모든 데이터를 한 번만 검색 한 다음 나중에 PagedList로 바꾸려면이 방법을 사용하십시오. 그런 다음 다른 데이터베이스를 검색하지 않고도 다른 위치에서 cachedQuery를 다시 사용할 수 있습니다.

+0

OHHHHH ... 멍청한 느낌이 들지 않습니다 !! 이것이 제가 잃어버린 것입니다. 선택 (jcefn => 새로운 ** MyObject() ** {XYZ = jcefn .... etc ...}); 내가 선택에서 익명에서 객체로 변경할 수 있다는 것을 깨닫지 못했다. 나는 선택 후에 변환을해야했지만. 나는 너희들에게 아마 벙어리 멍청한 놈이 있다는 것을 안다. 고맙습니다! – GPGVM

6

ToList()를 제거하십시오. query.ToList()IQueryable<T>를 구현하지 않는 List<T>을 반환합니다 - 당신은 아닌 IList의

var FPaged = new PagedList(query, pageIndex, pageSize); 
10

음 예을 IQueryable이 필요합니다. 실제로 ToList()은 전체 테이블을 메모리로 가져온 후에 모두 로컬로으로 수행되므로 페이징을 덜 유용하게 만듭니다.

ToList()의 전화를 제거하면 문제가되지 않을 수 있습니다.

EDIT : 좋아요, 익명 유형 때문에 좋지 않은 경우 ToList 전화를 추가하면 도움이되지 않습니다. 당신은 IQueryable<MyObject>에 돌출 된 쿼리를 사용하고자하거나, 당신이 정말로 익명의 유형에 대한 페이징 쿼리를 원하는 경우, 당신은 확장 메서드를 추가 할 수 있습니다

public static class PagingExtensions 
{ 
    public static PagedList<T> Paginate<T>(this IQueryable<T> source, 
              int pageIndex, int pageSize) 
    { 
     return new PagedList<T>(source, pageIndex, pageSize); 
    } 
} 

이 그럼 당신은 사용할 수 있습니다

// TODO: Use a more sensible variable name 
var FPaged = query.Paginate(pageIndex, pageSize); 
+0

오른쪽? 그게 내가 처음 한 일이고 그게 내게 말했다 : 'System.Linq.IQueryable '을 'System.Linq.IQueryable ' – GPGVM

+0

@ user1278561로 변환 할 수 없다 'var FPaged = new PagedList (query.ToList()), pageIndex, pageSize);'PagedList가 MyObject 형식을 취하도록 지정했지만 익명 형식입니다. – Harrison

+0

MyObject가 익명 형식과 같지 않기 때문입니다. 그것을 선택하거나 익명 타입 대신 MyObject로 지정하십시오. 그렇지 않으면 문자열을 int에 삽입하는 것과 같습니다. – Magus

관련 문제