2013-12-17 41 views
3

我有以下的LINQ加入:錯誤將LINQ匿名類型的IList <>

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:無法從「System.Collections.Generic.List」轉換爲「System.Linq.IQueryable等

所以,很顯然,我需要改變我的LINQ匿名類型,但不能完全確定什麼改變它?

注意我沒有包含很多簡潔的代碼,認爲它不需要理解,但如果需要,我會很樂意編輯它。

謝謝

+2

不要在你的查詢中調用ToList(),抱怨是它不能從IQueryable轉換爲List。 –

+0

正確?那麼這就是我第一次做的,它告訴我:不能從'System.Linq.IQueryable '轉換爲'System.Linq.IQueryable ' – GPGVM

回答

2

PagedList需要IQueryable<MyQuery>。您的查詢對象類型爲IQueryable<anonymous-type>。爲了讓你需要改變你的選擇到IQueryable<MyQuery>

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

你不需要.ToList()把它變成一個IQueryable,它已經是。

但是,如果你想將它傳遞給函數之前執行和緩存IQueriable,你可以做

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

在大多數情況下,這是不是你想要的。PagedList最需要IQueryable的原因很可能是因爲它只能檢索當前特定頁面所需的部分數據,並將潛在巨大數據集的其餘部分留在數據庫中的查詢之後。

但是,如果您實際上只想檢索所有數據一次,然後再將其轉換爲PagedList,這就是要走的路。然後,您也可以在其他地方重新使用cachedQuery,而不會導致其他數據庫檢索。

+0

OHHHHH ......我不覺得啞巴!這是我錯過的。選擇(jcefn => new ** MyObject()** {XYZ = jcefn .... etc ...});看到我沒有意識到我可以將它從匿名改爲select中的對象。我雖然我不得不在選擇後進行轉換。我知道你們可能是一個愚蠢的noob事情。謝謝! – GPGVM

6

擺脫ToList()。你需要一個IQueryable不是一個IList

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

嗯,是 - query.ToList()將返回一個List<T>,它沒有實現IQueryable<T>。事實上,ToList()會使分頁不那麼有用,因爲在將整個表取入內存之後,全部將在本地完成。

只是擺脫ToList()的呼叫,它可能會很好。

編輯:好吧,如果因爲匿名類型不好,添加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

RIGHT ??那麼這就是我先做的,它告訴我:不能從'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

相關問題