Edi Wang

Microsoft MVP for Azure

All Posts

Performance tips for Entity Framework

自从我用了EF,每次都很关心是否有潜在的性能问题。所以每次我写LINQ查询,都会使用SQL Profiler看一下实际生成的SQL语句,以便发现潜在的性能问题。也强烈建议大家这么去做,以免日后软件大了出了问题很难查。 一、只选择某列或某些列 有些时候,在C#里写LINQ虽然看着舒服,但性能不一定好,所以有必要做一些调整。比如这种情况: 我需要知道一篇文章的点击数,仅此而已,我可能会写: context.Post.FirstOrDefault(p => p.Id == postId).Hits; 或者: context.Post.Find(postId).Hits; 我期待着他们只去数据库里筛选Hits这一列的数据,然而,通过SQL Profiler会发现,这两条语句居然把全部列都给select出来了,访问Hits的操作实际是在内存中进行的。 虽然小表看不出性能问题,但万一你的表里有一列是存 …
C# ADO.NET Performance

How to Manually Upgrade Entity Framework 4.0 to 5.0

I have been working on the next version of my blog recently, and one of the updates is upgrading Entity Framework to version 5.0. When I initially set up the blog, I used EF4 that came with VS2010. The upgrade process from version 4.0 has to be done manually; using NuGet for the upgrade can only automatically update to versions 4.1 and above. Yesterday, I worked on it for a long time, and finally got the website up and running. Here's what I learned from the experience.
Entity Framework ADO.NET

给ASP.NET Membership增加权限(Rights)功能

首先说明,本文用的是非常屌丝的办法,针对SQL Server Membership的实现的一个很有局限性的权限模块,而不是真正对ASP.NET Membership本身的拓展。不喜慎入。 一、为什么要给Memebership增加权限系统 我们知道,ASP.NET Membership是基于Role的,其实是个RBAC,没有权限(Rights)功能。也就是说,我们只能够指定某个Role可以做什么事,丧失了一定的灵活性。比如,网站后台有个编辑文章的功能。如果基于Role判断,我只能认为:所有Admin、Editor、Teacher可以编辑文章。在MVC3里,可以用Authorize(Role=”Admin, Editor, Teacher”)的属性做到这一点。然而如果想要动态可配,则比较难了。然而,如果是基于Rights的验证,那我就可以认为:所有具有Edit权限的Role可以编辑文章。这样的 …
ASP.NET Membership RBAC

Infosys工作一年感触

现在已经快10月了,除去在嘉兴培训的日子,进Infosys工作已经一年了。就这一年里的感受做一些回顾和总结。我会以客观、公正的角度描述这一年的事情,给想要进Infosys的毕业生做一个参考。 1.刚毕业的人不要抱怨工资问题,首先要学会做事 我和我同学比较特殊,是毕业前就来公司的,这可能是学校为了提高就业率而计划的,所以我们是和别的学校的同学一起从嘉兴培训中心毕业到公司的,但转正比他们要晚一年,之前均算作实习。 在Infosys实习,工作时间和内容和正式员工是一样的。实习工资是1800,转正以后是3300(税前)。不少人抱怨工资低,其实我认为,实习的工资不算低,而且说句公道话,刚大学毕业的学生,有几个会做事的?特别是眼高手低的尤其让人讨厌。不谦虚学习,还经常请假,甚至旷工,这态度就不让人喜欢。我本人,不谦虚的说,一样刚大学毕业,但我能做的事很多,但我在态度上不那么娇惯。我想,公司付你钱,不管 …
Infosys

在Entity Framework中使用LINQ语句分页

我们知道,内存分页效率很低。并且,如果是WebForm的项目,页面上会有巨型ViewState,这必然不好。我自己博客用的是一个存储过程做的分页,用到现在都挺好,没有任何效率问题。后来想到,既然项目里有Entity Framework,那为什么不利用EF完成分页呢~ 稍做研究之后发现,EF分页其实很简单。不过一样写文章了,光贴代码是不负责的,还是得稍微介绍一下相关的知识。 一、页数计算 关于分页的基本原理,网上有很多文章,我就不多叙述了。但我发现很多介绍分页的文章里,计算页码公式都掐掉了,广为流传的版本是: totalPage = totalRecord / pageSize + 1 稍微推敲一下就会发现,这个公式在totalRecord和pageSize正好整除时,会多一页。比如10条记录,每页5条,应该是2页的,但结果是3。然而,不写+1又不行,因为要考虑到记录总数小于页尺寸的情况。现 …
C# Entity Framework SQL

Store and Read Images via SQL Server in ASP.NET MVC 3

First of all, I don't recommend storing images in the database, especially in a web project. Because file systems can provide static file access and get many benefits such as performance. Storing images in the database has certain limits. But if you must store images into SQL Server, here's how to do it.  SQL Image files are in fact, binary data. SQL Server provides us the image type for …
ASP.NET MVC SQL Server

JQuery搞定SyntaxHighlighter v3.x长代码自动换行

长代码换行是SyntaxHighlighter3.0版本之前的功能,但3.0之后就木了,本人认为主要猿因是gutter(代码行号指示器)的换行难做。因为3.x版是将代码行号和代码部分分开生成HTML的,猿来的老版本是在一起的。这样做是便于直接复制代码,而不会复制到行号上去。 很多人都在想办法让它实现换行,但都卡在代码行号的问题上。我关注这个问题已经差不多一年了,今天终于有了个比较漂亮的解决办法。 首先,强制给代码部分换行的CSS还是要写的: body .syntaxhighlighter .line { white-space: pre-wrap !important; } 这段CSS换行的前提是,pre标签的外边一定要有一个固定宽度的容器对象。比如一个600px宽度的div就可以。 然后,我们需要一段JQuery,用来计算被换行的代码显示在页面上的高度,然后赋值给它的
jQuery

博客数据库升级手记(四):XML数据的导入

在上一篇文章中,我已经完成了旧数据库的导入。然而,我的博客原先除了用Access数据库保存数据,也大量使用了XML存储,这借鉴自BlogEngine.NET,但后来发现XML存储弊大于利,最适合我的还是传统关系型数据库。因此,我有必要把所有非系统数据迁移到SQL Server上。这里要提一句,系统数据和用户数据是不一样的。系统数据是维持系统程序的运行所需要的数据,用户数据是用户使用系统产生的数据。系统数据包括系统设置(XML保存)、系统菜单等等,而用户数据除了博客文章,还有其创建的页面、友情链接,这些东西原先都是XML存储的,这次要统一迁移到SQL Server上。 首先,要对应XML的数据结构,在SQL Server中建立对应的表,列名和数据类型可以不一样,但要记得方便导入,不然就得用前几篇文章的技巧处理了。本文以友情链接表为例,建立的表如下: CREATE TABLE [dbo].[ …
SQL XML

博客数据库升级手记(三):标签库的导入

上篇文章留下了一个话题,关于标签库的导入。因为设计的变化,标签库无法从Keywords字段中直接导了。 首先,分析一下新表的结构。Tag表是用来保存所有标签的。Tag.Id是uniqueidentifier类型的主键,它将被PostTag表关联,来描述多对多的结构。Tag.Name是标签名称。这是可以从老数据的Blog.Keywords字段中获得的。 所以,第一步,是要从Keywords字段提取信息,插入到Tag表中。随后再处理关联问题。 老数据库里的Keywords字段中保存的,是以英文逗号分隔的文章标签。比如“ASP.NET,CSS,HTML”就表示这篇文章拥有3个标签,分别是ASP.NET、CSS和HTML。首先,我需要解析原先的Keywords字符串,将以逗号分隔的内容解析出来。但SQL Server没有提供Split函数,所以需要自己写一个: CREATE …
SQL

博客数据库升级手记(二):新数据库的建立及简单数据的导入

前面一片文章讲了如何将Access数据库直接导入SQL Server。但导入完成后,是强烈建议不要使用的。因为里面的object命名都与sql默认的不符,许多T-SQL行为也很诡异,所以我需要重新建立一个数据库,并且把旧的数据导入到新的数据库中。 新数据库的设计 对于新的数据库,这恰好是一次重构和升级的机会,我可以将4年前不合理的表结构设计重构一下(4年前也就是我第一次做这个博客的时候,菜鸟一只)。新的数据库中,博客子系统的设计如下(其实还有很多别的表,但不是给博客主业务用的,以后再讨论): 而旧数据库仅仅只有3张表:Blog、Category、Comment。 对于Category,没有太大的改动,仅仅是增加一个”Name”字段,用来做MVC的路由,而”DisplayName”的功能则和原先数据库是一样的,表示这个分类在页面上显示的名称。 Comment表增加了Email字段,是可选的 …
SQL SQL Server