加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将LINQ匿名类型转换为IList <>时出错

发布时间:2020-12-15 19:38:48 所属栏目:百科 来源:网络整理
导读:我有以下LINQ加入: var query = _ABC.Table .Join(_DEF.Table,cef = ...etc... }) .Join(_GHI.Table,extf = ...etc...}) .Select(jcefn= new { XYZ = jcefn....etc...}); linq很好并且返回我期望的(在LINQ pad中验证). 我试图将查询传递给具有此签名的扩展
我有以下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,而不会导致其他数据库检索.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读