首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

LINQ中将Func<TEntry,T>作为方法参数传递将导致效率急剧降低?该怎么处理

2012-04-08 
LINQ中将FuncTEntry,T作为方法参数传递将导致效率急剧降低?.工作中用到Linq,在大量数据分页时遇到一个奇

LINQ中将Func<TEntry,T>作为方法参数传递将导致效率急剧降低?.
工作中用到Linq,在大量数据分页时遇到一个奇怪的问题:将Func<TEntry,T>作为方法参数传递将导致无法读取数据。

请看如下代码:

C# code
protected void Page_Load(object sender, EventArgs e){    long recordCount, pageCount;    var paged = GetData(30, p,x=>true, x => x.id, out recordCount, out pageCount);    d1 = DateTime.Now;    list.DataSource = paged;    list.DataBind();    Response.Write("计时:" + (DateTime.Now - d1).TotalMilliseconds + "ms<br />");}private IQueryable<kaoqin_bak> GetData(    int _pageSize, int _pageIndex,     Func<kaoqin_bak,bool> where,    Func<kaoqin_bak, int> order,     out long _recordCount, out long _pageCount){    KaoQinDataContext db = new KaoQinDataContext();    var paged = (from x in db.kaoqin_bak select x)    .Where(where)    .OrderByDescending(order)    .Skip((_pageIndex - 1) * _pageSize)    .Take(_pageSize).AsQueryable();    _recordCount = (from p in db.kaoqin_bak select p.id).LongCount();    _pageCount = _recordCount / _pageSize;    return paged;}


按正常来讲,以上代码没有问题,但几乎没办法打开页面,IIS进程占用内存和CPU直线上升。

但是我讲Func<TEntry,T>参数去掉,硬编码到方法体内就能正常打开页面,百万计数据只需要20毫秒就可以打开:
C# code
……var paged = GetData(30, p, out recordCount, out pageCount);……private IQueryable<kaoqin_bak> GetData(    int _pageSize, int _pageIndex,     out long _recordCount, out long _pageCount){    KaoQinDataContext db = new KaoQinDataContext();    var paged = (from x in db.kaoqin_bak select x)    .Where(x=>true)    .OrderByDescending(x=>x.id)    .Skip((_pageIndex - 1) * _pageSize)    .Take(_pageSize).AsQueryable();    _recordCount = (from p in db.kaoqin_bak select p.id).LongCount();    _pageCount = _recordCount / _pageSize;    return paged;}

请问这是怎么回事呢?

[解决办法]
用Expression<Func<TEntry,T>>而不是Func<TEntry,T>
[解决办法]
当你使用Linq to SQL的时候,可以设置DataContext的.Log = Console.Out,看看你的代码到底是怎么跟数据库交互的。

热点排行