Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> C#/.Net  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701883
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

Linq中一旦使用Join就无法用Skip来进行分页

作者:cg1  摘自:access911.net  :cg1  更新日期:2009-9-9  浏览人次:

 

问题:

Linq中一旦使用Join就无法用Skip来进行分页,在用skip take 进行分页时将出现以下错误:
base {System.SystemException} = {"此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 Skip(),这种查询为单表(非联接)查询,或者为 Distinct、Except、Intersect 或 Union (非 Concat)操作。"}

This provider supports Skip() only over ordered queries returning entities or projections that contain all identity columns, where the query is a single-table (non-join) query, or is a Distinct, Except, Intersect, or Union (not Concat) operation. 

关键字:Linq,Join,Skip,Concat,IsPrimaryKey

 

回答:

究其原因是因为返回的映射类(PMSDataClassDataContext.BISearchResult)已经没有主键了。目前比较低效率的解决方案是直接 ToList,但是如果数据量很大,比如几十万条,可能效率会非常差。
能否从“为映射类”定义主键入手呢?目前还未能找到相关资料,希望高手能给与解答。

            int start =0;
            int pageSize =15;

            AnalyseProperty.PrintStoreDataParameters(e.Parameters);

            PMSDataClassDataContext db = new PMSDataClassDataContext();
            IQueryable<PMSDataClassDataContext.BISearchResult> result =
                //var result = 
                from c in db.ENBasicAttrubite
                join i in db.ENInnerInfo on c.WorkId equals i.WorkId
                join d in db.BIDepartment on i.DepartmentId equals d.Id into emp
                from d in emp.DefaultIfEmpty()
                select new PMSDataClassDataContext.BISearchResult
                //select new 
                {
                    //NewId = new System.Data.Linq.SqlClient.SqlMethods
                    UserCode = c.WorkId,
                    Path = db.cg_f_BITreePath("BIDepartment", d.Id),
                    Name = c.RealName,
                    Id = c.Id,
                    IsDel = c.IsDel,
                    AddDate = c.AddDate,
                    AddUserId = c.AddUserId,
                    DepartmentId = d.Id
                };
            if (ExistsStoreParameters(e.Parameters, "nodeid", Common.ParameterDataType.Integer))
            {
                //如果为0则显示所有的节点
                if (int.Parse(e.Parameters["nodeid"]) != 0)
                {
                    result = result.Where(f => f.DepartmentId.Equals(int.Parse(e.Parameters["nodeid"])));
                }
            }
            result = result.OrderByDescending(f => f.Path);
            e.TotalCount = result.Count();
            if ((e.Parameters["start"] != "") && (e.Parameters["limit"] != ""))
            {
                start = int.Parse(e.Parameters["start"]);
                pageSize = int.Parse(e.Parameters["limit"]);
            }
            //result = result.Skip(start).Take(pageSize);
            ////上述操作将引起以下错误:base {System.SystemException} = {"此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 Skip(),这种查询为单表(非联接)查询,或者为 Distinct、Except、Intersect 或 Union (非 Concat)操作。"}
            //this.StoreBIRight.DataSource = result;

            //目前只能以以下方式解决。但是由于是直接获取所有记录集,然后在内存中操作,所以如果返回集合
            //是几十万条记录,那么效率是非常差的。
            var resultPagging = result.ToList<PMSDataClassDataContext.BISearchResult>().Skip(start).Take(pageSize);
            this.StoreBIRight.DataSource = resultPagging;
            this.StoreBIRight.DataBind();


 

上述文章只代表作者的学习经历,并非绝对正确,仅供参考!

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     如何在删除查询中使用 JOIN 关系
     Linq中用反射生成非实体类的代码,作用只是加快点速度
     Linq中使用C#自定义函数生成的新字段不支持where和排序
     关于JET SQL 在 DELETE 语句中用 JOIN 关联两个表做删除的注意点
     新手来看:Access支持三表或三表以上的join操作吗?
     在 JET SQL 中如何实现 FULL JOIN?
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利