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

显示附加信息 >>>

Linq中使用C#自定义函数生成的新字段不支持where和排序

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

 

问题:

Linq中使用C#自定义函数生成的新字段不支持where和排序

        public void StoreBIRight_RefreshData(object sender, StoreRefreshDataEventArgs e)
        {
            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 
                         {
                             UserCode = c.WorkId,
                             DepartmentName= DepartmentPathLay(d.Id),
                             //DepartmentPath = DepartmentPathLay(d.Id),
                             Name = c.RealName,
                             Id = c.Id,
                             IsDel = c.IsDel,
                             AddDate = c.AddDate,
                             AddUserId = c.AddUserId,
                         };
            result = result.Skip(1).Take(1000);

            //注意下列两句都是错误的。
            //result = result.OrderByDescending(f => f.DepartmentName);
            result = result.Where(f=> f.DepartmentName.Contains("d"));
            //“/PMSEXTDLLOLD”应用程序中的服务器错误。 方法“System.String DepartmentPathLay(Int32)”不支持转换为 SQL。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NotSupportedException: 方法“System.String DepartmentPathLay(Int32)”不支持转换为 SQL。 源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 堆栈跟踪: [NotSupportedException: 方法“System.String DepartmentPathLay(Int32)”不支持转换为 SQL。] System.Data.Linq.SqlClient.Visitor.VisitMethodCall(SqlMethodCall mc) +575017 System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +2146 System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8 System.Data.Linq.SqlClient.Visitor.VisitMethodCall(SqlMethodCall mc) +45 System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +2146 System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8 System.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore(SqlSelect select) +46 System.Data.Linq.SqlClient.Visitor.VisitSelect(SqlSelect select) +20 System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +1024 System.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, ReadOnlyCollection`1 parentParameters, SqlNodeAnnotations annotations) +588 System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) +155 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +132 System.Data.Linq.DataQuery`1.System.Collections.IEnumerable.GetEnumerator() +32 System.Linq.d__aa`1.MoveNext() +68 System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +7663156 System.Linq.Enumerable.ToList(IEnumerable`1 source) +61 Newtonsoft.Json.JsonSerializer.SerializeEnumerable(JsonWriter writer, IEnumerable values) +66 Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) +432 Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) +252 Coolite.Ext.Web.JSON.Serialize(Object obj, List`1 converters, Boolean quoteName) +352 Coolite.Ext.Web.JSON.Serialize(Object obj) +138 Coolite.Ext.Web.Store.RaiseAjaxPostBackEvent(String eventArgument) +1594 Coolite.Ext.Web.Store.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +71 Coolite.Ext.Web.ScriptManager.RaisePostBackEvent(String eventArgument) +2393 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 版本信息: Microsoft .NET Framework 版本:2.0.50727.3053; ASP.NET 版本:2.0.50727.3053 

            //if (result.Count() > 0)
            //{
            //    AnalyseProperty.PrintProperty("BISearchResult", result.First());
            //}
            //这里添加StoreBIRight的数据加载代码。
            StoreBIRight.DataSource = result;
            StoreBIRight.DataBind();
        }

        //根据部id递归返回他的所有上级部门名称
        private string DepartmentPathLay(int DepartmentId){
            //db.BIDepartment 为sql server 中的一个实体表,在dbml中映射的一个实体类
            PMSDataClassDataContext db = new PMSDataClassDataContext();
            var result = from c in db.BIDepartment
                         where c.Id == DepartmentId
                         select new
                         {
                             c.ParentId,
                             c.DepartmentName
                         };
            if (result.Count() > 0)
            {
                return result.First().DepartmentName + "\\" + DepartmentPathLay(result.First().ParentId.Value);
            }
            else { return ""; }
        }


 

方法一:

解决方案是使用sql server中的自定义函数,并将自定义函数拖动到DBML文件中生成db的方法。

[Function(Name="dbo.DepartmentPathLay",
IsComposable=true)]
public String DepartmentPathLay(
[Parameter(DbType="Int")] System.Nullable<int> DepartmentId)
{
    return ((String)(this.ExecuteMethodCall(this, 
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), DepartmentId)
     .ReturnValue));
}


我们使用时,可以用以下代码来调用:

var result = from c in db.ENBasicAttrubite
        select new
        {
            c.DepartmentId,
            DepartmentPath =
                db.DepartmentPathLay(c.DepartmentId)
        };

 


方法二:


直接不动脑子用 ExecuteQuery 直接执行SQL语句

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
IEnumerable<Customer> results = db.ExecuteQuery<Customer>
    ("SELECT contactname FROM customers WHERE city = {0}",
    "London");


 


上述文章仅代表作者个人的学习经历,若有错误请在评论中进行指出,谢谢。

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

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

 

 
相关文章
     没有手动相关文章
     Linq中一旦使用Join就无法用Skip来进行分页
     Linq中用反射生成非实体类的代码,作用只是加快点速度
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利