c# – 将LINQ匿名类型转换为IList <>时出错
我有以下LINQ加入:
var query = _ABC.Table .Join(_DEF.Table,cef => ...etc... }) .Join(_GHI.Table,extf => ...etc...}) .Select(jcefn=> new { XYZ = jcefn....etc...}); linq很好并且返回我期望的(在LINQ pad中验证). 我试图将查询传递给具有此签名的扩展方法: 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匿名类型,但不确定究竟要将其更改为什么? 请注意,为了简洁起见,我没有包含大量代码,认为它不需要理解,但我很乐意在需要时编辑它. 谢谢 解决方法
PagedList需要IQueryable< MyQuery>.您的查询对象的类型为IQueryable< anonymous-type>.获得IQueryable< MyQuery>你需要将你的选择更改为:
var query = _ABC.Table .Join(_DEF.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>(),pageSize); 在大多数情况下,这不是你想要的. PagedList最有可能需要IQueryable,因为它只会检索特定页面当前所需的部分数据,而在数据库中将剩下的潜在巨大数据集留在查询后面. 但是如果你真的想要只检索一次所有数据,然后再把它变成一个PagedList,这就是你要走的路.然后,您还可以在其他位置重用cachedQuery,而不会导致其他数据库检索. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |