[已解决问题] 关于linq的返回类型
提问时间: 2008-02-01 00:23
悬赏分:80 浏览:634 次

//关于这块我总是弄不清,请大家指点一下.下面这样没有错. 

public List<BookInfo> GetCurrentDataSet(int pageSize, int pageNo)

       {

          List<BookInfo> pageSet = BookInfos.Skip(pageSize*pageNo).Take(pageSize).ToList();

           return pageSet;

提问者:beyoung - 初学一级
最佳答案
VS知道.当然,其实是csc知道.
编译能成功就没错.

你补充的那个是因为
new { c.Author,c.BookImg}
这个表达式创建的是一个匿名类型的对象,而不是BookInfo.

匿名类型不能作为方法的返回值的类型.你可以这样做:
 BookInfos.Select(c => new BookInfo { Author = c.Author, BookImg = c.BookImg}).Skip(pageSize*pageNo).Take(pageSize).ToList()
这样返回的就是List<BookInfo>了.

也可以创建一个新的类型:
struct BookAuthorAndImage
{
public string Author
{
get;set;
}
public sting BookImage
{
get;set;
}
}
然后这样:
BookInfos.Select(c => new BookAuthorAndImage { Author = c.Author, BookImg = c.BookImg}).Skip(pageSize*pageNo).Take(pageSize).ToList()
并把方法的返回类型改为List<BookAuthorAndImage>.
2008/2/1 1:23:06 回答者:deerchao


提问者对于答案的评价:谢谢
其它回答(2)
z
5个月前   回答者:wsky - 菜鸟二级
主要是这句:
BookInfos.Skip(pageSize*pageNo).Take(pageSize).ToList();
BookInfos在linq中是一个对象.代表数据库中的一张表,那么使用拓展方法Skip和Take来取得数据库中部分数据.那么实际上BookInfos.Skip(pageSize*pageNo).Take(pageSize)处理完成后返回的是一个IEnumerable<BookInfos>.
接下来在对这个IEnumerable<BookInfos>调用ToList()方法.根据数据库中筛选出来的数据迭代出一个List<BookInfos>.实现过程是创建一个List<BookInfos>. 然后foreach数据库中BookInfo表中每一行数据.new一个BookInfos对象.赋上值.最后add到List<BookInfos>中.
这样说.能方便你理解吗?
5个月前   回答者:Kenneth Byron - 小虾三级
评论
5个月前   beyoung :
有字数限制吗?怎么问题少了一半...
5个月前   beyoung :
BookInfos.Select(c => new { c.Author,c.BookImg}).Skip(pageSize*pageNo).Take(pageSize).ToList();
加上select就会提示类弄转换的错误.
Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Collections.Generic.List<_2008Test.Models.BookInfo>'
我就是想返回记录集,除了返回List<bookinfo> 还可以返回什么类型呢?
5个月前   beyoung :
谢谢deerchao,按你说的OK了,我又试了返回以下几种类型, 
      public IEnumerable<BookInfo> GetCurrentDataSet(int pageSize, int pageNo)
       {
IEnumerable<BookInfo> pageSet = BookInfos.Select(c => new BookInfo{BookName=c.BookName,Author=c.Author}).Skip(pageSize * (pageNo-1)).Take(pageSize).ToList();
//这里我还是用了.ToList();试了不用也可以,区别就在延迟加载吗?
 return pageSet;
       }
我试着返回Table<BookINfo>结果却又是类型转换的错误.想返回这个怎么写呢?

这句
BookInfos.Select(c => new BookAuthorAndImage { Author = c.Author, BookImg = c.BookImg}).Skip(pageSize*pageNo).Take(pageSize)
最直接返回的是这个IEnumerable<BookInfo>类型吗?
我就是想查询完后是什么类型我就返回什么类型,
就别转换类型了,这样效率会高点对吧.
问题比较多,达人辛苦了!
5个月前   deerchao :
关于返回Table,这个我没有研究过.

后一个问题,我觉得直接返回IEnumerable<BookInfo>效率是最高的.

没错,用不用ToList()的区别就在于什么时候加载数据.
5个月前   beyoung :
嗯,好的,谢谢!
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除