搜索
首页数据库mysql教程LINQ-to-SQL那点事~利用反射在LINQ-to-SQL环境中实现Ado.net的CU

回到目录 对于linq to sql提供的CURD 操作 ,给我们的感觉就是简单,容易使用,更加面向对象,不用拼SQL语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合实体,希望进行update 操作 ,如果你还用linq to sql提代的updat

回到目录

对于linq to sql提供的CURD操作,给我们的感觉就是简单,容易使用,更加面向对象,不用拼SQL语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合实体,希望进行update操作,如果你还用linq to sql提代的update,那你服务器就快要挂了,呵呵。

为什么呢?

对于LINQ提借的命令,如update(list),它会把list进行foreache的遍历,然后一条一条指令的向SQLSERVER发送,好家伙,这要是1000,1W条实体的集合,进行update操作,这个对IO的开销和服务器的性能来说都是没法接受的,呵呵,应该是一个SQL链接,一个指令,就能解决问题呀!

自己封套性能更好的CURD集合操作(选自我的entity framework架构,linq to sql没来的及实现

     <span>///</span> <span><summary></summary></span>
        <span>///</span><span> SQL<strong>操作</strong>类型
        </span><span>///</span> <span></span>
        <span>protected</span> <span>enum</span><span> SQLType
        {
            Insert,
            Update,
            Delete,
        }

        </span><span>///</span> <span><summary></summary></span>
        <span>///</span><span> 构建Update语句串
        </span><span>///</span> <span></span>
        <span>///</span> <span><typeparam name="TEntity"></typeparam></span>
        <span>///</span> <span><param name="entity"></span>
        <span>///</span> <span><returns></returns></span>
        <span>private</span> Tuplestring, <span>object</span>[]> CreateUpdateSQL<tentity>(TEntity entity) <span>where</span> TEntity : <span>class</span><span>
        {
            </span><span>if</span> (entity == <span>null</span><span>)
                </span><span>throw</span> <span>new</span> ArgumentException(<span>"</span><span>The database entity can not be null.</span><span>"</span><span>);
            List</span>string> pkList = GetPrimaryKey<tentity>().Select(i =><span> i.Name).ToList();

            Type entityType </span>=<span> entity.GetType();
            </span><span>var</span> table = entityType.GetProperties().Where(i =>
                !<span>pkList.Contains(i.Name)
                </span>&& i.GetValue(entity, <span>null</span>) != <span>null</span>
                && i.PropertyType != <span>typeof</span><span>(EntityState)
                </span>&& !(i.GetCustomAttributes(<span>false</span>).Length > <span>0</span>
                && i.GetCustomAttributes(<span>false</span>).Where(j => j.GetType() == <span>typeof</span>(NavigationAttribute)) != <span>null</span><span>)
                </span>&& (i.PropertyType.IsValueType || i.PropertyType == <span>typeof</span>(<span>string</span>)) <span>//</span><span>过滤导航属性</span>
<span>                 ).ToArray();

            </span><span>//</span><span>过滤主键,航行属性,状态属性等</span>
            <span>if</span> (pkList == <span>null</span> || pkList.Count == <span>0</span><span>)
                </span><span>throw</span> <span>new</span> ArgumentException(<span>"</span><span>The Table entity have not a primary key.</span><span>"</span><span>);
            List</span>object> arguments = <span>new</span> Listobject><span>();
            StringBuilder builder </span>= <span>new</span><span> StringBuilder();

            </span><span>foreach</span> (<span>var</span> change <span>in</span><span> table)
            {
                </span><span>if</span><span> (pkList.Contains(change.Name))
                    </span><span>continue</span><span>;
                </span><span>if</span> (arguments.Count != <span>0</span><span>)
                    builder.Append(</span><span>"</span><span>, </span><span>"</span><span>);
                builder.Append(change.Name </span>+ <span>"</span><span> = {</span><span>"</span> + arguments.Count + <span>"</span><span>}</span><span>"</span><span>);
                </span><span>if</span> (change.PropertyType == <span>typeof</span>(<span>string</span>) || change.PropertyType == <span>typeof</span><span>(DateTime))
                    arguments.Add(</span><span>"</span><span>'</span><span>"</span> + change.GetValue(entity, <span>null</span>).ToString().Replace(<span>"</span><span>'</span><span>"</span>, <span>"</span><span>char(39)</span><span>"</span>) + <span>"</span><span>'</span><span>"</span><span>);
                </span><span>else</span><span>
                    arguments.Add(change.GetValue(entity, </span><span>null</span><span>));
            }

            </span><span>if</span> (builder.Length == <span>0</span><span>)
                </span><span>throw</span> <span>new</span> Exception(<span>"</span><span>没有任何属性进行更新</span><span>"</span><span>);

            builder.Insert(</span><span>0</span>, <span>"</span><span> UPDATE </span><span>"</span> + <span>string</span>.Format(<span>"</span><span>[{0}]</span><span>"</span>, entityType.Name) + <span>"</span><span> SET </span><span>"</span><span>);

            builder.Append(</span><span>"</span><span> WHERE </span><span>"</span><span>);
            </span><span>bool</span> firstPrimaryKey = <span>true</span><span>;

            </span><span>foreach</span> (<span>var</span> primaryField <span>in</span><span> pkList)
            {
                </span><span>if</span><span> (firstPrimaryKey)
                    firstPrimaryKey </span>= <span>false</span><span>;
                </span><span>else</span><span>
                    builder.Append(</span><span>"</span><span> AND </span><span>"</span><span>);

                </span><span>object</span> val = entityType.GetProperty(primaryField).GetValue(entity, <span>null</span><span>);
                builder.Append(GetEqualStatment(primaryField, arguments.Count));
                arguments.Add(val);
            }
            </span><span>return</span> <span>new</span> Tuplestring, <span>object</span>[]><span>(builder.ToString(), arguments.ToArray());

        }

        </span><span>///</span> <span><summary></summary></span>
        <span>///</span><span> 构建Delete语句串
        </span><span>///</span> <span></span>
        <span>///</span> <span><typeparam name="TEntity"></typeparam></span>
        <span>///</span> <span><param name="entity"></span>
        <span>///</span> <span><returns></returns></span>
        <span>private</span> Tuplestring, <span>object</span>[]> CreateDeleteSQL<tentity>(TEntity entity) <span>where</span> TEntity : <span>class</span><span>
        {
            </span><span>if</span> (entity == <span>null</span><span>)
                </span><span>throw</span> <span>new</span> ArgumentException(<span>"</span><span>The database entity can not be null.</span><span>"</span><span>);

            Type entityType </span>=<span> entity.GetType();
            List</span>string> pkList = GetPrimaryKey<tentity>().Select(i =><span> i.Name).ToList();
            </span><span>if</span> (pkList == <span>null</span> || pkList.Count == <span>0</span><span>)
                </span><span>throw</span> <span>new</span> ArgumentException(<span>"</span><span>The Table entity have not a primary key.</span><span>"</span><span>);

            List</span>object> arguments = <span>new</span> Listobject><span>();
            StringBuilder builder </span>= <span>new</span><span> StringBuilder();
            builder.Append(</span><span>"</span><span> Delete from </span><span>"</span> + <span>string</span>.Format(<span>"</span><span>[{0}]</span><span>"</span><span>, entityType.Name));

            builder.Append(</span><span>"</span><span> WHERE </span><span>"</span><span>);
            </span><span>bool</span> firstPrimaryKey = <span>true</span><span>;

            </span><span>foreach</span> (<span>var</span> primaryField <span>in</span><span> pkList)
            {
                </span><span>if</span><span> (firstPrimaryKey)
                    firstPrimaryKey </span>= <span>false</span><span>;
                </span><span>else</span><span>
                    builder.Append(</span><span>"</span><span> AND </span><span>"</span><span>);

                </span><span>object</span> val = entityType.GetProperty(primaryField).GetValue(entity, <span>null</span><span>);
                builder.Append(GetEqualStatment(primaryField, arguments.Count));
                arguments.Add(val);
            }
            </span><span>return</span> <span>new</span> Tuplestring, <span>object</span>[]><span>(builder.ToString(), arguments.ToArray());
        }

        </span><span>///</span> <span><summary></summary></span>
        <span>///</span><span> 构建Insert语句串
        </span><span>///</span><span> 主键为自增时,如果主键值为0,我们将主键插入到SQL串中
        </span><span>///</span> <span></span>
        <span>///</span> <span><typeparam name="TEntity"></typeparam></span>
        <span>///</span> <span><param name="entity"></span>
        <span>///</span> <span><returns></returns></span>
        <span>private</span> Tuplestring, <span>object</span>[]> CreateInsertSQL<tentity>(TEntity entity) <span>where</span> TEntity : <span>class</span><span>
        {
            </span><span>if</span> (entity == <span>null</span><span>)
                </span><span>throw</span> <span>new</span> ArgumentException(<span>"</span><span>The database entity can not be null.</span><span>"</span><span>);

            Type entityType </span>=<span> entity.GetType();
            </span><span>var</span> table = entityType.GetProperties().Where(i => i.PropertyType != <span>typeof</span><span>(EntityKey)
                 </span>&& i.PropertyType != <span>typeof</span><span>(EntityState)
                 </span>&& i.Name != <span>"</span><span>IsValid</span><span>"</span>
                 && i.GetValue(entity, <span>null</span>) != <span>null</span>
                 && !(i.GetCustomAttributes(<span>false</span>).Length > <span>0</span>
                 && i.GetCustomAttributes(<span>false</span>).Where(j => j.GetType() == <span>typeof</span>(NavigationAttribute)) != <span>null</span><span>)
                 </span>&& (i.PropertyType.IsValueType || i.PropertyType == <span>typeof</span>(<span>string</span>))).ToArray();<span>//</span><span>过滤主键,航行属性,状态属性等</span>
<span>
            List</span>string> pkList = GetPrimaryKey<tentity>().Select(i =><span> i.Name).ToList();
            List</span>object> arguments = <span>new</span> Listobject><span>();
            StringBuilder fieldbuilder </span>= <span>new</span><span> StringBuilder();
            StringBuilder valuebuilder </span>= <span>new</span><span> StringBuilder();

            fieldbuilder.Append(</span><span>"</span><span> INSERT INTO </span><span>"</span> + <span>string</span>.Format(<span>"</span><span>[{0}]</span><span>"</span>, entityType.Name) + <span>"</span><span> (</span><span>"</span><span>);

            </span><span>foreach</span> (<span>var</span> member <span>in</span><span> table)
            {
                </span><span>if</span> (pkList.Contains(member.Name) && Convert.ToString(member.GetValue(entity, <span>null</span>)) == <span>"</span><span>0</span><span>"</span><span>)
                    </span><span>continue</span><span>;
                </span><span>object</span> value = member.GetValue(entity, <span>null</span><span>);
                </span><span>if</span> (value != <span>null</span><span>)
                {
                    </span><span>if</span> (arguments.Count != <span>0</span><span>)
                    {
                        fieldbuilder.Append(</span><span>"</span><span>, </span><span>"</span><span>);
                        valuebuilder.Append(</span><span>"</span><span>, </span><span>"</span><span>);
                    }

                    fieldbuilder.Append(member.Name);
                    </span><span>if</span> (member.PropertyType == <span>typeof</span>(<span>string</span>) || member.PropertyType == <span>typeof</span><span>(DateTime))
                        valuebuilder.Append(</span><span>"</span><span>'{</span><span>"</span> + arguments.Count + <span>"</span><span>}'</span><span>"</span><span>);
                    </span><span>else</span><span>
                        valuebuilder.Append(</span><span>"</span><span>{</span><span>"</span> + arguments.Count + <span>"</span><span>}</span><span>"</span><span>);
                    </span><span>if</span> (value.GetType() == <span>typeof</span>(<span>string</span><span>))
                        value </span>= value.ToString().Replace(<span>"</span><span>'</span><span>"</span>, <span>"</span><span>char(39)</span><span>"</span><span>);
                    arguments.Add(value);

                }
            }


            fieldbuilder.Append(</span><span>"</span><span>) Values (</span><span>"</span><span>);

            fieldbuilder.Append(valuebuilder.ToString());
            fieldbuilder.Append(</span><span>"</span><span>);</span><span>"</span><span>);
            </span><span>return</span> <span>new</span> Tuplestring, <span>object</span>[]><span>(fieldbuilder.ToString(), arguments.ToArray());
        }
    
        </span><span>///</span> <span><summary></summary></span>
        <span>///</span><span> 执行SQL,根据SQL<strong>操作</strong>的类型
        </span><span>///</span> <span></span>
        <span>///</span> <span><typeparam name="TEntity"></typeparam></span>
        <span>///</span> <span><param name="list"></span>
        <span>///</span> <span><param name="sqlType"></span>
        <span>///</span> <span><returns></returns></span>
        <span>protected</span> <span>string</span> DoSQL<tentity>(IEnumerable<tentity> list, SQLType sqlType) <span>where</span> TEntity : <span>class</span><span>
        {
            StringBuilder sqlstr </span>= <span>new</span><span> StringBuilder();
            </span><span>switch</span><span> (sqlType)
            {
                </span><span>case</span><span> SQLType.Insert:
                    list.ToList().ForEach(i </span>=><span>
                    {
                        Tuple</span>string, <span>object</span>[]> sql =<span> CreateInsertSQL(i);
                        sqlstr.AppendFormat(sql.Item1, sql.Item2);
                    });
                    </span><span>break</span><span>;
                </span><span>case</span><span> SQLType.Update:
                    list.ToList().ForEach(i </span>=><span>
                    {
                        Tuple</span>string, <span>object</span>[]> sql =<span> CreateUpdateSQL(i);
                        sqlstr.AppendFormat(sql.Item1, sql.Item2);
                    });
                    </span><span>break</span><span>;
                </span><span>case</span><span> SQLType.Delete:
                    list.ToList().ForEach(i </span>=><span>
                    {
                        Tuple</span>string, <span>object</span>[]> sql =<span> CreateDeleteSQL(i);
                        sqlstr.AppendFormat(sql.Item1, sql.Item2);
                    });
                    </span><span>break</span><span>;
                </span><span>default</span><span>:
                    </span><span>throw</span> <span>new</span> ArgumentException(<span>"</span><span>请输入正确的参数</span><span>"</span><span>);
            }
            </span><span>return</span><span> sqlstr.ToString();
        }</span></tentity></tentity></tentity></tentity></tentity></tentity></tentity></tentity>

 

前方永远都是通往成功的路,只要你相信,它就会更快的实现...

回到目录

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
解决Java反射异常(ReflectiveOperationException)的方法解决Java反射异常(ReflectiveOperationException)的方法Aug 26, 2023 am 09:55 AM

解决Java反射异常(ReflectiveOperationException)的方法在Java开发中,反射(Reflection)是一种强大的机制,它允许程序在运行时动态地获取和操作类、对象、方法和属性等。通过反射,我们可以实现一些灵活的功能,比如动态创建对象、调用私有方法、获取类的注解等。然而,使用反射也会带来一些潜在的风险和问题,其中之一就是反射异常(

如何利用GitLab进行项目文档管理如何利用GitLab进行项目文档管理Oct 20, 2023 am 10:40 AM

如何利用GitLab进行项目文档管理一、背景介绍在软件开发过程中,项目文档是非常重要的资料,不仅能够帮助开发团队了解项目的需求和设计,还能提供给测试团队和客户参考。为了方便项目文档的版本控制和团队协作,我们可以利用GitLab来进行项目文档管理。GitLab是一个基于Git的版本控制系统,除了支持代码管理,还可以管理项目文档。二、GitLab环境搭建首先,我

Golang函数的反射和类型断言的应用和底层实现Golang函数的反射和类型断言的应用和底层实现May 16, 2023 pm 12:01 PM

Golang函数的反射和类型断言的应用和底层实现在Golang编程中,函数的反射和类型断言是两个非常重要的概念。函数的反射可以让我们在运行时动态的调用函数,而类型断言则可以帮助我们在处理接口类型时进行类型转换操作。本文将深入讨论这两个概念的应用以及他们的底层实现原理。一、函数的反射函数的反射是指在程序运行时获取函数的具体信息,比如函数名、参数个数、参数类型等

抖音推荐视频是什么意思?如何利用抖音推荐视频?抖音推荐视频是什么意思?如何利用抖音推荐视频?Mar 27, 2024 pm 03:01 PM

抖音作为一个全球知名的短视频社交平台,靠着其独特的个性化推荐算法赢得了广大用户的青睐。本文将深入研究抖音视频推荐的价值和原理,帮助读者更好地了解和充分利用这一功能。一、什么是抖音推荐视频抖音推荐视频是根据用户的兴趣和行为习惯,利用智能推荐算法为用户筛选和推送个性化视频内容。抖音平台通过分析用户的观看历史、点赞和评论行为、分享记录等数据,从庞大的视频库中精选出最符合用户口味的视频进行推荐。这种个性化推荐系统不仅提高了用户体验,也帮助用户发现更多符合其喜好的视频内容,从而增强用户黏性和留存率。在这个

高级Python元编程:动态代码生成和反射高级Python元编程:动态代码生成和反射Sep 06, 2023 pm 09:13 PM

Python是一种灵活的编程语言,为开发人员提供了广泛的功能和工具。其强大的功能包括元编程——一种先进的技术,使开发人员能够在运行时动态地操作和生成代码。在本文中,我们将踏上高级Python元编程领域的旅程,特别关注动态代码生成和反射。通过采用这些技术,开发人员可以创建能够适应、修改甚至自省的代码,从而为创建灵活高效的应用程序开启了新的可能性世界。通过探索Python中动态代码生成和反射的概念和实际应用,我们将揭示元编程如何彻底改变开发过程,使开发人员能够生成健壮且高度适应性的代码。了解元编程元

Go 语言中的反射机制的局限性是什么?Go 语言中的反射机制的局限性是什么?Jun 09, 2023 pm 11:31 PM

Go语言作为一门静态类型语言,在代码编写时需要明确每个变量的类型。但是,在某些情况下,我们需要对程序中的类型进行动态的分析和操作,这时就需要用到反射机制。反射机制可以在程序运行时动态地获取程序对象的类型信息,并能够对其进行分析和操作,非常有用。但是,Go语言中反射机制也存在一些局限性,下面我们来详细了解一下。反射机制对性能的影响使用反射机制可以大大增强代

Java中的字节码与反射技术Java中的字节码与反射技术Jun 15, 2023 pm 10:47 PM

Java是一种面向对象的编程语言,代码在编译后不直接变成机器语言,而是转化为字节码。字节码是Java虚拟机(JVM)可以理解的一种二进制形式。因此,在JVM上运行的程序可以在任何平台上运行,这就是Java的跨平台性。Java字节码的特征Java字节码是一种中间代码。编译器将Java源代码转换为字节码并存储在.class文件中。字节码指令可以轻松地转换为指示任

如何利用 Go 语言进行并发编程?如何利用 Go 语言进行并发编程?Jun 10, 2023 am 10:33 AM

随着计算机硬件的不断发展,处理器中的CPU核心不再单独增加时钟频率,而是增加核心数量。这引发了一个显而易见的问题:如何发挥这些核心的性能?一种解决方法是通过并行编程,即同时执行多个任务,以充分利用CPU核心。这就是Go语言的一个独特之处,它是一门专为并发编程而设计的语言。在本文中,我们将探讨如何利用Go语言进行并发编程。协程首先,我们需要了解

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器