Subscribe: 博客园-兴国安邦
http://126.cnblogs.com/rss.aspx
Added By: Feedage Forager Feedage Grade B rated
Language: Chinese simplified
Tags:
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: 博客园-兴国安邦

博客园_兴国安邦



C# 3.0, Linq, Linq To Sql



Updated: 2014-04-15T15:03:11Z

 



月薪10000起步,移民新加坡,快速之路 - Tom Song

2011-11-25T03:30:00Z

月薪10000起步,招募赴新加坡 .net程序员。 截止明年3月份, 请转发。没有学士及以上学位者, 请勿投简历,有意愿的请事先准备好护照。(本招聘停止,有意者可以继续投简历,将来有空缺我会联系你。)关于公司首先,我们是新加坡公司。公司主要做customer relationship managem...月薪10000起步,招募赴新加坡 .net程序员。 截止明年3月份, 请转发。没有学士及以上学位者, 请勿投简历,有意愿的请事先准备好护照。(本招聘停止,有意者可以继续投简历,将来有空缺我会联系你。) 关于公司 首先,我们是新加坡公司。公司主要做customer relationship management(CRM)软件和web,winform类金融交易软件,公司在新加坡成立6个月, 网站还没有。现有5名dev,计划招募到15人左右。可以3月份以后入职,公司办理工作签证。 来新加坡2年可以申请绿卡。公司待遇丰厚,年假12天,病假14天, 外加一个月的津贴,年终根据项目有花红。欢迎有志青年报名。单身的男生, 我可以负责介绍对象。 移民新加坡,快速之路。 关于我:  我不是中介, 也不是hr, 我是PM。新招来的人, 会安排在我的team里。所有招募的人都要经过我的面试。联系:Tom Song简历发:sguoan@gmail.com 新加坡电话:  65  -  8399 2379 .     拨打国际电话 先 拨00.  或者你告诉我, 我打给你。  我会于明年一月份回国,统一安排面试。 然后帮大家申请工作签证,个人准备护照,一时找不到住处的, 我会帮忙找房子。 关于新加坡和工作签证: 新加坡以法律严而闻名西方社会,其至今保留鞭刑。犯法的代价是严重的,所以大家都很尊法守纪。新加坡同时也是花园国家,花园城市,以城立国。华人占70%左右,其他是马来人,印度人和其它种族。新加坡使用新币,和人民币兑换大约是1:5左右。它和中国都使用东八时区。常年温度在24到34左右,没有四季的分别,属于热带多雨性气候。其地理位置处于北纬4度,紧紧扼住马六甲海峡,以海运,旅游,金融,原油冶炼和半导体生产为支柱性产业。移民新加坡一般需要在新加坡工作2年左右。 新加坡的工作签证分为若干种。其中有EP,SP,和wp。工作签证的区分是按你所获得的薪水来区分的。最低等的为wp,主要是建筑工人和佣人等。我们公司为全部外籍员工申请的都是EP,属于技术引进性人才签证。  关于职位: 职位一:Web Designer(美工 1~2人)月薪10000元起步,根据实际水平调整。 硬性要求,1,本科学历及以上, 证件齐全。2, 基本日常英语。3, 会photoshop,懂html和css, 会切片。4,懂简单的jquery,会用javascript做简单的动态页面。5,工作2年以上。有外企经验者优先。 职位二:Web Developer(6~8人), 月薪10000元起步,根据实际水平调整要求:1,本科学历及以上, 证件齐全。2, 基本日常英语。3,C# .Net, asp.net, mvc, ado.net, wcf, wpf, winform.。4, 工作2年以上。有外企经验者优先。 职位三:Oracle DBA (1~2人)月薪15000元起步,根据实际水平调整。 要求:1,本科学历及以上, 证件齐全。2, 基本日常英语。3,有Oracle 管理经验,知道常用的性能分析和跟踪工具4, 工作2年以上。有外企经验者优先。5,可以写store procedure,会做优化   职位四:Senior Web Developer (2~3人)月薪15000元起步,根据实际水平调整。 requirement1, Must meet all conditions for Junior web developer and then plus1)You must have at least 4 years of relevant experience2)You must be self motivated in executing work deliverables and problem resolutions3)You must have the ability to w[...]



Linq To Sql 项目从Beta迁移到RTM注意事项 - Tom Song

2007-11-28T11:16:00Z

Linq To Sql 项目从Beta迁移到RTM要注意那些事项呢?RTM相对beta又做了那些变动呢?本文为你揭开这些问题。Linq To Sql 项目从Beta迁移到RTM要注意那些事项呢?RTM相对beta又做了那些变动呢?本文为你揭开这些问题。这里,我们只谈项目中经常碰到的,其他的略去不写。你若是有疑问,可以回贴问,我再帮你找。最后,放出修正文档。特别感谢伍迷TX的督促。1,函数名称的改变在添加,更新和删除实体对象时,本blog中的Linq To Sql进阶系列(三)CUD和Log 一文中所提及的,其函数名更改如下。 Beta 2 Name RTM Name Add InsertOnSubmit AddAll InsertAllOnSubmit Remove DeleteOnSubmit RemoveAll DeleteAllOnSubmit 还有其他函数名称的改变,但是,好像本blog从来都没有提过,所以,不做太多说明。We have also changed the members of ChangeSet to match these new names: Beta 2 Name RTM Name AddedEntities Inserts RemovedEntities Deletes ModifiedEntities Updates 2, dbml编码以前是16,现在是8。因为这个也可能让你的程序编译不过。3,一个叫DataSetExtensions的Assembly去掉这个好像只在asp.net的程序里才会有这个问题,在你的web.config里,如果有这个问题,去掉这段。这个assembly早就没有了。4, Attach函数的改变Attach函数用来在不同的datacontext间,传递实体对象。现在这里做了更改。The solution is add db.DeferredLoadingEnabled = false; to the code to void deferred loading in the first datacontext. Customer c = null; Using(DataContext db1 = new DataContext()) { db1.DeferredLoadingEnabled = false; c= db1.Customers.First(); } Using(DataContext db2 = new DataContext()) { db2.Customers.Attach(c); ….do something… } 5,查询语法中不允许再显示构造实体对象比如,在beta2中,你可以这么玩,   var q = from c in db.Customers                    where Country == "USA"                    select new Customer { Name = c.Name, City = c.City };现在,这么玩就会在run-time时抛异常。这个地方的修改是因为一个bug 引起的。在beta2中,下面的代码           var q = from c in db.Customers                     select new Customer { City = c.City };            foreach (var item in q)    [...]



杀人游戏系列 之三 提供游戏代码下载 - Tom Song

2007-10-25T12:43:00Z

在上一节中,我们讲到了业务实体的设计。好多人可能都觉得,为什么没有在这些实体类中放置方法,不够oo. 这实际和项目整体的设计有关。在杀人游戏系列 之一 一节中,我们提到了,整个项目的架构是网络模式的。而网络模式势必有client和server端。那client和server之间的通信成为这个游戏逻辑的推动力。本节从wcf层面的设计讲起,看看游戏逻辑是如何驱动的。最后放出提供游戏代码下载。如果有时间,笔者会继续改进。在上一节中,我们讲到了业务实体的设计。好多人可能都觉得,为什么没有在这些实体类中放置方法,不够oo. 这实际和项目整体的设计有关。在杀人游戏系列 之一 一节中,我们提到了,整个项目的架构是网络模式的。而网络模式势必有client和server端。那client和server之间的通信成为这个游戏逻辑的推动力。本节从wcf层面的设计讲起,看看游戏逻辑是如何驱动的。1,client与server的消息体的设计既然client和server之间的通信是不可避免的。那需要先定义通信消息的数据格式。第一个被定义的是登陆消息格式。如下:    [DataContract]    public class LogonFormat    {        [DataMember]        public string LogonPerson { get; set; }        [DataMember]        public string IPPortServiceString { get; set; }    }这里只有用户的用户名和其ip地址。第二个被定义的是交谈消息的格式。如下:    [DataContract]    public class ChatFormat    {        //ID        [DataMember]        public string Sender { get; set; }        [DataMember]        public string MsgBody { get; set; }        //TODO:When chat one to one        //"" if this message is not to a given person        [DataMember]        public string Receipter { get; set; }        //Time flag, indicate daytime or night        [DataMember]        public TimeFlag TimeFlag { get; set; }    }做下简单的介绍,sender是发送者,msgbody是消息体。receipter是接收人。timeflag是白天还是黑天。在这里,为了继续简化游戏。我们认为规定了,server端只维持一个game。这个设计无疑是个败笔。但是时间紧迫,5天内会熟练使用wcf就已经不错了,别说把游戏的逻辑设计的完美无缺陷。如果server端只维持一个游戏,整个逻辑就简单了许多。所以,chatformat并没有game编号的定义。最后一个被定义消息体是,voteforamt,如下:    [DataContract]    public class VoteFormat    {        [DataMember]        public string Voter { get; set; }        [DataMember]        publi[...]



杀人游戏系列 之二 - Tom Song

2007-10-15T10:38:00Z

在第一篇中,我们已经引出了话题。在经过初步的分析之后,整个team的思路很明确。从业务逻辑入手,兵分两路,一路向ui开进,一路向database开进。而关键的部分就是中间实体类的设计。在第一篇中,我们已经引出了话题。在经过初步的分析之后,整个team的思路很明确。从业务逻辑入手,兵分两路,一路向ui开进,一路向database开进。而关键的部分就是中间实体类的设计。1,模型的重构在第一篇中,我们已经确定了基本的模型。但是,这个模型准确嘛?无论是平民,还是杀手,以及警察,他们只是游戏中的一个角色。而这个角色真实的身份,应该是用户。这样,先把用户类抽提出来。如下。大家需要注意的是,这里的类图,我是拿OR designer画的。先暂且不管每个property是什么类型的。这个类包含一个user最基本的信息。userid是用来标志他的唯一编号。其中isonline来存储这个用户的状态。winnum和playnum分别是他赢的次数和玩的次数。在有了user类后,下一个没有争议的类就该是game了。它的定义如下gameno是每个游戏的唯一标志。这其中还定义了开始时间,结束时间。当然,还定义了谁最终赢得了game,以及平民,杀手,警察的数量。这两个实体,是本程序中,最基本的实体。也能准确体现现实世界中对象。那么,针对一个user,只有把他放在特定的game中,他才能算是一个玩家。如果,他不加入到game中,那他就不算玩家,而只能算是一个user。有的user是平民,有的杀手,而又有的是警察。那又该如何体现user在game中的角色呢?思路有这么两个,第一,从user继承,分别写平民,杀手等类。第二,单独创建一个player类。针对第一个思路,在创建对象的时候,需要new出不同的类,而且在判断user的身份时,需要调用反射,看是什么类的对象才知道。更麻烦的是,如何把它向数据库方向推呢?这个思路写出的代码很容易懂,却也有它的弱点。不知道它弱点的人,就无法使用好它。第二个思路比较简单,切实可行。player类的定义如下。这个类里,定义了userid和gameno,这样,就很容易和game和user做关联。isactive用来保存这个player是否还活着。roleid则是其身份的标志。deadactivityno是他在那次活动中死去(先不说这个)。这里,roleid作为一个property来判断玩家的身份,避免了不同的类需要反射的问题。更重要的是,这样的设计很容易推向数据库。那roleid 的值实际上被限定在某个集合内。这个集合被定义为枚举类型。如下:    public enum RoleFlag : int    {        Civilian = 1,        Killer = 2,        Police = 4    }这里为1,2,4是方便后来的位运算。并没有其他的特殊设置。 这样,最基本的模型确定了。紧跟着需要做的,就是设计各个class中的property一系列的属性了。如图这是gameno的属性设置。这里它被设成主键。还有,它在clr中的type为int,在server端的data type 为int not null identity。也就是int的自增型。在这里,其他的都好设置,唯独Server Data Type需要设计者对数据库和dbml格式特别熟悉。这也是为什么笔者一直带着大家熟悉dbml。把各个类中的字段的属性设置后,下一步就是建立关系了。这个模型也很容易懂。一个user在不同时间可以加入不同的game,一个game可以拥有多个user。那这样,正好用player这个实体类将他们联系起来。就是一个user在不同时间,可以扮演不同角色,一[...]



Linq To Sql进阶系列 -目录导航 - Tom Song

2007-10-15T07:20:00Z

Linq To Sql进阶系列 目录导航博客园CLR基础研究团队|CLR团队精品系列|C# 3.0专题[Linq To Sql进阶系列]目录导航 1 Linq To Sql进阶系列(一)-从映射讲起 本系列,或多或少,直接或间接依赖入门系列知识。但,依然追求独立成章。因本文作者水平有限,文中错误难免,敬请读者指出并谅解。本系列将会和入门并存。2 Linq To Sql进阶系列(二)M:M关系 在Linq To Sql进阶系列(一) 一文中,我们谈到了数据库中的两种基本关系1:M 与1:1. 而现实世界中,还有一种M:M 的关系。比如,一个老师可以有多个学生,而一个学生也可以有多个老师。老师和学生的关系就是多对多的关系。这些关系在数据库中是如何反映的呢?3 Linq To Sql进阶系列(三)CUD和Log CUD就是Create, Update, Delete。在别人都写过了后,还有什么是新鲜的呢?如果,碰到了数据库自增型字段,在插入数据后,需要你自己去获取自增的值吗?4 Linq To Sql进阶系列(四)User Define Function篇 Linq To Sql如何提供对User Define Function的支持的呢?如果,用户想使用数据库自定义的函数该怎么办呢?本文将详细为你阐述。5 Linq To Sql进阶系列(五)Store Procedure篇 Store Procedure,存储过程。就先谈谈它与udf的区别吧。6 Linq To Sql进阶系列(六)用object的动态查询与保存log篇 动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处。而Linq的推出,是为了弥补编程中的 Data != Object 的问题。我们又该如何实现用object的动态查询呢? 7 Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别 在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询。本文在上文的基础上,再做更加深入的引申。同时修正上文中一些不妥的地方。提供相关源代码下载.[公告]【CLR团队公告】CLR团队精品系列活动公告、邀请函、团队纲领本文链接:Linq To Sql进阶系列 -目录导航,转载请注明。[...]



C# 3.0入门系列-目录导航 - Tom Song

2007-10-15T07:07:00Z

[C# 3.0入门系列]目录导航   博客园CLR基础研究团队|CLR团队精品系列|C# 3.0专题[C# 3.0入门系列]目录导航  1 C# 3.0 入门系列(一)从linq开始引C# 3.0。2 C# 3.0入门系列(二)数据库的准备,引入Linq To Sql的准备。3 C# 3.0入门系列(三) 第一个Linq To Sql工程。4 C# 3.0入门系列(四)-之Select操作 Select语法。 5 C#3.0入门系列(五)-之Where操作 Where操作语法。 6 C#3.0入门系列(六)-之OrderBy操作 OrderBy 操作语法。7 C#3.0入门系列(七)--之OR工具介绍 映射工具的介绍,OR Designer8 C#3.0入门系列(八)-之GroupBy操作 GroupBy 操作入门。9 C#3.0入门系列(九)-之GroupBy操作 更多GroupBy操作。10 C#3.0入门系列(十)-之Join操作 Join操作11 C#3.0入门系列(十一)-之In, Like操作 In & Like操作12 C#3.0入门系列(十二)-Lambda表达式中LiftingLambda表达式中的Lifting[公告]【CLR团队公告】CLR团队精品系列活动公告、邀请函、团队纲领本文链接:C# 3.0入门系列-目录导航,转载请注明。[...]



杀人游戏系列 之一 - Tom Song

2007-10-12T07:32:00Z

本文以一个游戏为例,向大家演示了了linq to sql技术,wcf技术,wpf技术在程序开发中的应用。本文以一个游戏为例,向大家演示了了linq to sql技术,wcf技术,wpf技术在程序开发中的应用。本游戏程序是5个人的团队,花了5天的时间完成的。其中,在此之前,我们对wcf和wpf从来都没有接触过。也和大家一样现学现做。程序做的很是仓促,自己后来看着都很烂。不足之处,还请大家指出并谅解。本文不光向大家展示这些技术,同时还把整个项目过程,完整的展现给大家。在此,特别感谢Peter, Boler, Sean, Cloudy. 谢谢你们允许我把它拿到网上来,形成本文.本文将按实际项目中的时间,给大家展开。最后,一起提供所有code。1,业务分析首先team在一起讨论了杀人游戏。其中,好多人并不曾玩过。为了让大家有个明确的认识,我们还特意花了20分钟的时间,玩了一场。通过游戏,大家对游戏的规则有了一个初步的认识。对其中的角色的职责,比如平民,杀手,警察等,也有了初步的认识。Sean从网上当下来一段游戏规则,如下玩家角色分为平民方和杀手方,好人方通过指认功能将所有的杀手指认出来,并通过投票投死杀手,平民则胜利,游戏结束。反之,杀手通过“杀人”功能和指认功能将全部平民杀死或者投票投死则杀手方胜利,游戏结束。具体流程: 当注册用户进入游戏并点击按钮后,即表示其可以开始杀人游戏,待就绪用户数达到规定范围内时,游戏创建者点击,游戏开始,系统自动为游戏参与者随机分配角色,对于杀手角色,会自动在其窗口中提示其身份; 游戏是从白天开始的,所有玩家可以在白天的时候发言和投票,当其中一个玩家的票数超过当前存活玩家总数的一半时,该玩家死亡,没有遗言;当没有玩家的票数过半,则当天不死人,系统设置的时间到后进入夜晚; 进入夜晚,系统将在玩家列表中显示自己的杀手标志,白天标志消失,如不是杀手角色则不显示。杀手集团只能在夜晚系统规定的时间内使用“杀人”功能,并且必须共同杀死同一个人,该“杀人”功能才有效。当杀手集团完成杀人或者夜晚时间过去后,夜晚立即结束,被杀玩家死亡,被杀者可以留遗言。被杀者以及被投票投死的玩家将在玩家列表出显示各自角色的标志,该标志所有人可见。死者在亡灵区可自由发言,存活玩家看不见亡灵区对话; 此时进入第二天白天,所有玩家可以发言并且投票,规则同上。以此类推,直到游戏结束最终,为了简化游戏,我们制定了如下的游戏规则。 原文转贴1). There are 2 roles, civilian and man.2) All the civilians and bad men can vote to anyone, Host server determines the most- ballot person to die during daytime.3) All the bad men can vote to anyone of the commonalties to be killed, also they get the result by voting, and the most- ballot person will be killed during night.4) The scenario 2) and scenario 3) recurrent once one scenario is finished.5).After any one of the 2 scenarios finished each time, Host server will judge if all the rest persons are civilians or bad men, if this comes to true, the side of the rest persons will this round, the game finished. 6).While voting in scenario 2) and scenario 3), if once there are more than 1 person get the most-ballot, the voting is invalid, it will let all the players vote again in this scenario till the only one most-ballot person is selected (killed), then go to another scenario.2,建立领域模型这些游戏的规则,是我们在实际玩游戏时制定出来的。[...]



谈Linq To Sql的优劣--纯个人观点 - Tom Song

2007-09-27T16:13:00Z

Linq To Sql是Microsoft开发的针对解决data!=object问题的新技术。在笔者的一系列的文章中,对它已经做了大量的介绍。现在,笔者将从经验的角度,谈谈它的优劣.并拿其和NHibernate做了比较,看看Linq To Sql又有那些优势呢?Linq To Sql是Microsoft开发的针对解决data!=object问题的新技术。在笔者的一系列的文章中,对它已经做了大量的介绍。现在,笔者将从经验的角度,谈谈它的优劣.1,Linq To Sql的优点在Linq To Sql推出之前,我们只是把sql语句形成一个string,然后,通过ado.net传给sql server,返回结果集.这里的缺陷就是,如果你sql语句写的有问题,只有到运行时才知道.而且并不所有的人都懂数据库的。Linq To SQl 在一切围绕数据的项目内都可以使用。特别是在项目中缺少sql server方面的专家时,Linq To SQl的强大的功能可以帮我们快速的完成项目。Linq To SQl的推出,是让大家从烦琐的技术细节中解脱出来,更加关注项目的逻辑.Linq To Sql的出现,大大降低了数据库应用程序开发的门楷,它实质是事先为你构架了数据访问层,势必将加快数据库应用程序的开发进度。Linq To Sql解放了众多程序员,让他们的把更多的精力放到业务逻辑以及code上,而不是数据库。对于初学者来讲,Linq To Sql可以让他们迅速进入数据库应用程序开发领域,节约了培训成本。Linq To SQl 的实现,是在ado.net和c#2.0的基础上的。它通过自动翻译sql语句,并把结果集创建成对象并返回。这里我们可以看出,发送到Sql Server端的sql语句是Linq To Sql自动生成的。这对不懂sql的人来说,无疑是个福音.第二,Linq To Sql语句是在编译期间就做检查的。而不是运行时检查。这样,那里出了问题,可以及时更改,而不是到了运行时才发现问题。第三, Linq To Sql是针对对象操作的,更符合今天的oo呼声。在Linq To SQl 之前,在java领域有Hibernate,在net领域有NHibernate技术,来实现object/relational 持久和查询服务。那和NHibernate比起来,它又有那些优势呢.第一,影射代码自动生成。VS2008提供了SqlMetal和OR Designer两个工具来完成此步骤。而在NHibernate中,你不得不自己手工写。第二,影射代码有更多的选择.NHibernate只能把数据库的信息配置在一个xml中,而Linq To Sql有两种方式,一个是放到xml中,我们称为Externl Mapping, 再一种就是以Attribute的形式,存在于各个property中。当然,笔者本人并没有使用过NHibernate,只是从资料上得到这些消息,所以无法给出更多的比较。2,Linq To Sql的缺点很久前,有个网友问到这么一个问题。 他在界面上,有个DataView,里面绑定了一些Column,然后,他勾选那一列,就按某列排序。其传回的参数是列的名字。然后问我,该怎么用Dlinq 来实现。在以前拼接Sql语句的年代,这个很简单,一个" order by " + string,想按什么排就按什么来排。而现在,dlinq是用是一个对象的属性,已经不可能拼接了。我当时给他的答案是这样的。private void Methods(string orderId){    var q = db.Customers.Select(c=>c);    switch(orderId)    {        case "ID":            q = q.OrderBy(c=>c.ID);            break;        case "Name":            q = q.OrderBy([...]



Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别 - Tom Song

2007-09-22T16:39:00Z

在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询。本文在上文的基础上,再做更加深入的引申。同时修正上文中一些不妥的地方。提供相关源代码下载.在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询。本文在上文的基础上,再做更加深入的引申。同时修正上文中一些不妥的地方。1, object的动态查询续首先要做的事情,就是将Find的函数改成扩展方法。扩展方法只能放在静态类里,而且它的第一个参数必须带this关键字。在上文中,作者留下了一个迷题。当需要or条件时,又该如何做呢?本文也将这个问题给出回答。但是对于动态Like的条件,笔者依然还没有找到一个较好的方法。为了增加or条件,函数的声明也再一次被改动。如下:    public static IQueryable Find(this IQueryable source, TEntity obj, bool isAnd) where TEntity : class在上文中,我们还碰到了System.Nullable此类类型不支持的问题。其实这个地方主要原因在于我们构造right端的Expression Tree时,没有给它参数。那么这个问题通过Expression right = Expression.Constant(p.GetValue(obj, null), p.PropertyType); 可以得到修复。那整个函数修改后,如下:    public static IQueryable Find(this IQueryable source, TEntity obj, bool isAnd) where TEntity : class    {        if (source == null)            throw new ArgumentNullException("Source can't be null!!");        //获得所有property的信息        PropertyInfo[] properties = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);        Expression condition = null;        //先构造了一个ParameterExpression对象,这里的c,就是Lambda表达中的参数。(c=>)          //本变量被移出了foreach循环        ParameterExpression param = Expression.Parameter(typeof(TEntity), "c");        //遍历每个property        foreach (PropertyInfo p in properties)        {            if (p != null)            {                Type t = p.PropertyType;                //只支持value型和string型的影射                if (t.IsValueType || t == typeof(string))                {                    //如果不为null才算做条件                    if (p[...]



Linq To Sql进阶系列(六)用object的动态查询与保存log篇 - Tom Song

2007-09-09T13:21:00Z

动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处。而Linq的推出,是为了弥补编程中的 Data != Object 的问题。我们又该如何实现用object的动态查询呢?动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处。而Linq的推出,是为了弥补编程中的 Data != Object 的问题。我们又该如何实现用object的动态查询呢?1,用object的查询是什么?我们可以简单的举这么一个例子。我们到公安局查找一个人。首先,我们会给出他的一些特征,比如,身高多少,年龄多少,性别,民族等。那么,我们把这个人的一些特征输入电脑。我们希望,电脑能给我们返回这个人的信息。而实际上,有相同特征的人太多了,常常返回一个集合。那让我们把这个过程抽象到程式里。我们需要new出来一个对象。这个对象包含了我们能知道的基本信息。而后,把这个对象传给Linq To Sql,等待返回结果。根据这些基本的需求,我们来定义下面的函数,为了实现这个函数对任何实体都是有用的,我们把它定义为generic的。为了不破坏Linq To Sql延迟加载的规矩,我们把它的返回类型定义为IQueryable。如下:public IQueryable Find(TEntity obj) where TEntity : class思路出来了,先new出来一个对象,然后把对象传给这个函数,我们渴望它能返回与这个对象匹配的结果集。为了让它和DataContext有关系,我们把这个函数放到DataContext的partial类里。鼠标右击Linq To Sql文件,选择view code,这个时候,vs会为你创造一个DataContext的partial类,其扩展名比影射文件少了中间的desiger。大家要注意,你如果想自己修改影射文件,请放到这个文件里。这样当影射code被刷新时,才不会冲掉你自己的修改。先大体描述下我们的思路。NorthwindDataContext db = new NorthwindDataContext();//先new出一个对象            Customer c = new Customer();//添入我们知道的最基本的信息,可以从ui获得c.City = "London";c.Phone = "23236133";//call函数find返回结果var q = db.Find(c);2,原理Linq To Sql支持用户动态生成lambda表达式。本文中所实现的方法,正是反射加lambda动态表达式。我们先来看如何动态生成lambda表达式。在Linq 中,lambda表达式会首先转化为Expression Tree,本文并不详解Expression Tree。Expression Tree是lambda表达式从code的形式转化为data的结果,是一种更高效的在内存中的数据结构。比如:  Func f = x => x + 1;                               // CodeExpression> e = x => x + 1;       // Data第二个,其实也就是第一个转化后的形式。那好了,有了这个前提,我们就可以动态构造这个Expression Tree了。// 先构造了一个ParameterExpression对象,这里的c,就是Lambda表达中的参数。(c=>)                            ParameterExpression param = Expression.Parameter(typeof(TEntity), "c"); //构造表达式的右边,值的一边Expression right = Expression.Constant(p.GetValue(obj, null));//构造表达式的[...]