如何根据linq 表达式生成SQL代码

问题描述

代码运行后得出的SQL代码来不正确,company的被解析成Convert(value(WXMAPTEST.Form1+<>c__DisplayClass0).company))请高手帮忙,下面贴出所有代码privatevoidbutton1_Click(objectsender,EventArgse){using(SqlConnectionSQC=newSqlConnection()){SQC.ConnectionString="DataSource=TESTSERVER\TESTSERVER2005;InitialCatalog=WeiXin;IntegratedSecurity=False;UserID=sa;Password=kf10086;MultipleActiveResultSets=True";SQC.Open();DbQueryProviderDP=newDbQueryProvider(SQC);Query<WX_GoodsStock>Data=newQuery<WX_GoodsStock>(DP);intcompany=100;stringsss="rrrrr";IQueryable<WX_GoodsStock>query=Data.Where(u=>u.CompanyID==company&&u.GoodsName==sss);//输出SQL代码stringss=query.ToString();}}publicclassQuery<T>:IQueryable<T>,IQueryable,IEnumerable<T>,IEnumerable,IOrderedQueryable<T>,IOrderedQueryable{QueryProviderprovider;Expressionexpression;publicQuery(QueryProviderprovider){if(provider==null){thrownewArgumentNullException("provider");}this.provider=provider;this.expression=Expression.Constant(this);}publicQuery(QueryProviderprovider,Expressionexpression){if(provider==null){thrownewArgumentNullException("provider");}if(expression==null){thrownewArgumentNullException("expression");}if(!typeof(IQueryable<T>).IsAssignableFrom(expression.Type)){thrownewArgumentOutOfRangeException("expression");}this.provider=provider;this.expression=expression;}ExpressionIQueryable.Expression{get{returnthis.expression;}}TypeIQueryable.ElementType{get{returntypeof(T);}}IQueryProviderIQueryable.Provider{get{returnthis.provider;}}publicIEnumerator<T>GetEnumerator(){return((IEnumerable<T>)this.provider.Execute(this.expression)).GetEnumerator();}IEnumeratorIEnumerable.GetEnumerator(){return((IEnumerable)this.provider.Execute(this.expression)).GetEnumerator();}publicoverridestringToString(){returnthis.provider.GetQueryText(this.expression);}}publicabstractclassQueryProvider:IQueryProvider{protectedQueryProvider(){}IQueryable<S>IQueryProvider.CreateQuery<S>(Expressionexpression){returnnewQuery<S>(this,expression);}IQueryableIQueryProvider.CreateQuery(Expressionexpression){TypeelementType=TypeSystem.GetElementType(expression.Type);try{return(IQueryable)Activator.CreateInstance(typeof(Query<>).MakeGenericType(elementType),newobject[]{this,expression});}catch(TargetInvocationExceptiontie){throwtie.InnerException;}}SIQueryProvider.Execute<S>(Expressionexpression){return(S)this.Execute(expression);}objectIQueryProvider.Execute(Expressionexpression){returnthis.Execute(expression);}publicabstractstringGetQueryText(Expressionexpression);publicabstractobjectExecute(Expressionexpression);}internalstaticclassTypeSystem{internalstaticTypeGetElementType(TypeseqType){Typeienum=FindIEnumerable(seqType);if(ienum==null)returnseqType;returnienum.GetGenericArguments()[0];}privatestaticTypeFindIEnumerable(TypeseqType){if(seqType==null||seqType==typeof(string))returnnull;if(seqType.IsArray)returntypeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());if(seqType.IsGenericType){foreach(TypearginseqType.GetGenericArguments()){Typeienum=typeof(IEnumerable<>).MakeGenericType(arg);if(ienum.IsAssignableFrom(seqType)){returnienum;}}}Type[]ifaces=seqType.GetInterfaces();if(ifaces!=null&&ifaces.Length>0){foreach(Typeifaceinifaces){Typeienum=FindIEnumerable(iface);if(ienum!=null)returnienum;}}if(seqType.BaseType!=null&&seqType.BaseType!=typeof(object)){returnFindIEnumerable(seqType.BaseType);}returnnull;}}internalclassObjectReader<T>:IEnumerable<T>,IEnumerablewhereT:class,new(){Enumeratorenumerator;internalObjectReader(DbDataReaderreader){this.enumerator=newEnumerator(reader);}publicIEnumerator<T>GetEnumerator(){Enumeratore=this.enumerator;if(e==null){thrownewInvalidOperationException("Cannotenumeratemorethanonce");}this.enumerator=null;returne;}IEnumeratorIEnumerable.GetEnumerator(){returnthis.GetEnumerator();}classEnumerator:IEnumerator<T>,IEnumerator,IDisposable{DbDataReaderreader;FieldInfo[]fields;int[]fieldLookup;Tcurrent;internalEnumerator(DbDataReaderreader){this.reader=reader;this.fields=typeof(T).GetFields();}publicTCurrent{get{returnthis.current;}}objectIEnumerator.Current{get{returnthis.current;}}publicboolMoveNext(){if(this.reader.Read()){if(this.fieldLookup==null){this.InitFieldLookup();}Tinstance=newT();for(inti=0,n=this.fields.Length;i<n;i++){intindex=this.fieldLookup[i];if(index>=0){FieldInfofi=this.fields[i];if(this.reader.IsDBNull(index)){fi.SetValue(instance,null);}else{fi.SetValue(instance,this.reader.GetValue(index));}}}this.current=instance;returntrue;}returnfalse;}publicvoidReset(){}publicvoidDispose(){this.reader.Dispose();}privatevoidInitFieldLookup(){Dictionary<string,int>map=newDictionary<string,int>(StringComparer.InvariantCultureIgnoreCase);for(inti=0,n=this.reader.FieldCount;i<n;i++){map.Add(this.reader.GetName(i),i);}this.fieldLookup=newint[this.fields.Length];for(inti=0,n=this.fields.Length;i<n;i++){intindex;if(map.TryGetValue(this.fields[i].Name,outindex)){this.fieldLookup[i]=index;}else{this.fieldLookup[i]=-1;}}}}}publicclassDbQueryProvider:QueryProvider{DbConnectionconnection;publicDbQueryProvider(DbConnectionconnection){this.connection=connection;}publicoverridestringGetQueryText(Expressionexpression){returnthis.Translate(expression);}publicoverrideobjectExecute(Expressionexpression){DbCommandcmd=this.connection.CreateCommand();cmd.CommandText=this.Translate(expression);DbDataReaderreader=cmd.ExecuteReader();TypeelementType=TypeSystem.GetElementType(expression.Type);returnActivator.CreateInstance(typeof(ObjectReader<>).MakeGenericType(elementType),BindingFlags.Instance|BindingFlags.NonPublic,null,newobject[]{reader},null);}privatestringTranslate(Expressionexpression){returnnewQueryTranslator().Translate(expression);}}

时间: 2024-10-24 04:44:06

如何根据linq 表达式生成SQL代码的相关文章

php将mysql数据库整库导出生成sql文件的详细代码

 下面是php将mysql数据库整库导出生成sql文件的详细代码,希望对大家在用php编程时备份数据有一定帮助 由网上搜到,有更改.    文件名:db_backup.php    源代码如下:   代码如下: <?php  ini_set("max_execution_time", "180");//避免数据量过大,导出不全的情况出现.    /*    程序功能:mysql数据库备份功能  作者:唐小刚  说明:  本程序主要是从mysqladmin中提取

Excel数据生成Sql语句的方法

选中想要生成的列,套用表格格式,选中表包含标题的选项确定,然后在最右边的一列第二行处,点击函数功能,选择CONCATENATE,在文本里输入想要的结构即可  代码如下 复制代码 ,=CONCATENATE("('",[@id],"','",[@name],"'),") 这样生成的之后的语句可以写为  代码如下 复制代码 insert table1 (id,name) values ('1', "测试1"),('2', &quo

JavaScript生成SQL查询表单的方法_javascript技巧

本文实例讲述了JavaScript生成SQL查询表单的方法.分享给大家供大家参考.具体如下: 这里使用JavaScript生成复杂的SQL查询表单,运行一下就明白了,它可以根据选择的查询条件,自动修改你的SQL语句,是一个很典型的应用. 运行效果截图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm

处理数据批量生成sql插入语句

最近在做一个天气预报模块,首先需要将客户端公网ip转换成所在城市,然后将所在城市名转换成对应的城市代码, 在网上找到了城市代码,但是需要处理一下,看了看,有三百多城市及对应的城市代码,想存到数据库.就想着做一个 数据处理自动生成sql语句的工具,提高效率. 直辖市 "北京","上海","天津","重庆" "101010100","101020100","101030100&qu

用XSLT 2.0生成SQL

假定您是一名新的 PHP 项目的工程团队主管,并且要求必备的条件都已满足,初步的数据模型包括大约 150 个表.现在该考虑一下进度表了.估计您每天能编写一个数据库访问类并完成其单元测试,因此,150 个表要用 150 天的时间.假设每个月工作 20 天,是不是要用将近八个月的时间来编写数据库访问层? 这样做可能不行,需要有一种方法来缩短所需的时间.您可以使用持久性框架,但即使这种框架能够把时间减半,仍然还需要四个月的时间.您还可以编写通用的类库,但是这样的库使用起来复杂不说,而且还非常容易出错,

Orleans 支持Linq 表达式参数

由于Orlans不支持Linq 表达式参数,所以只能把Linq 表达式参数转换为JObject类型的参数 有关Orleans自定义序列化参数http://dotnet.github.io/orleans/Documentation/Advanced-Concepts/Serialization.html 序列化JObject类型的参数代码如下: using Newtonsoft.Json.Linq; using Orleans.Runtime; using Orleans.Serializati

PHP+Mysql实现多关键字与多字段生成SQL语句的函数_php技巧

本文实例讲述了PHP+Mysql实现多关键字与多字段生成SQL语句的函数的方法.分享给大家供大家参考.具体实现方法如下: 先看实例: 复制代码 代码如下: $keyword="1 2 3"; echo $sql=search($keyword,"enter_gongyin_pic","a+b+c"); //函数生成,没有LIMIT,没有ORDER BY 生成: 复制代码 代码如下: SELECT * FROM `enter_gongyin_pic

SQL代码自动生成器

SQL代码自动生成器,效果图如下:         实现原理很简单:       通过数据库名,获取到数据表名,进而获取到数据字段.通过可视化的选择+自定义的添加修改,一步一步完成SQL语句的编写. 其中对于常用的存储过程参数列表的书写提供了方便.       还可以直接通过数据表名,自动生成数据访问类:       您可以在 http://sites.google.com/site/zhangqs008/chang-yong-gong-ju下载到该小程序,程序名称:SQLCodeMaker.r

使用CASE表达式替代SQL Server中的动态SQL

原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expression-instead-of-dynamic-sql-in-sql-server/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012620 问题: 在决定IF/ELS