<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_hq_space - Live and Learn</title><subtitle type="text">人生路漫漫其长,吾将上下而求索..</subtitle><id>http://feed.cnblogs.com/blog/u/23235/rss</id><updated>2011-11-07T10:24:07Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/23235/rss"/><entry><id>http://www.cnblogs.com/hq2008/archive/2011/11/07/2239625.html</id><title type="text">LINQ&amp;amp;Entity Framework</title><summary type="text">LinQ家族五大成员：LinQ to Objects - 默认功能，用来实现对内存中集合对象的查询LinQ to SQL - 针对SQL Server的查询，它是一个带有可视化的操作界面的ORM工具LinQ to DataSet - 对强类型化或弱类型化的DataSet或独立的DataTable进行查询LinQ to Entity - 对实体框架中EDM定义的实体集合进行查询。LinQ to XML - 对XML文档进行查询创建等操作。C#语法与LinQ相关的新增功能1.隐式强类型变量在C#3.0中可以使用var关键字隐式定义强类型局部变量。《图1》这里的var关键字定义变量与JavaScri</summary><published>2011-11-07T10:24:00Z</published><updated>2011-11-07T10:24:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2011/11/07/2239625.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2011/11/07/2239625.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;LinQ家族五大成员：&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;LinQ to Objects - 默认功能，用来实现对内存中集合对象的查询&lt;br /&gt;LinQ to SQL - 针对SQL Server的查询，它是一个带有可视化的操作界面的ORM工具&lt;br /&gt;LinQ to DataSet - 对强类型化或弱类型化的DataSet或独立的DataTable进行查询&lt;br /&gt;LinQ to Entity - 对实体框架中EDM定义的实体集合进行查询。&lt;br /&gt;LinQ to XML - 对XML文档进行查询创建等操作。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;C#语法与LinQ相关的新增功能&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="3"&gt;1.隐式强类型变量&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;在C#3.0中可以使用&lt;strong&gt;&lt;font color="#0000ff"&gt;var关键字&lt;/font&gt;&lt;/strong&gt;隐式定义强类型局部变量。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/868e67f58780ac11bd31093e.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图1》&lt;br /&gt;这里的var关键字定义变量与JavaScript定义变量看起来很像但二者有着本质的区别。&lt;br /&gt;&lt;strong&gt;JavaScript定义的变量是弱类型的变量&lt;/strong&gt;，也可理解为是一种通用类型的变量，它可以容纳各种类型的值，还可以在运行过程中动态修改其中的内容类型。下面这种写法在JavaScript中是正确的：&lt;br /&gt;&lt;font color="#0000ff"&gt;var obj = 3.14;&lt;br /&gt;obj = "hello world";&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;C#中的var则是种强类型的变量，它在定义的时候会确定数据类型，分配内存空间。上&lt;/strong&gt;面这两名代码在C#3.0中会报错，因为第一句已经把obj定义为double型的变量，第二句把字符串赋值给double是错误的操作。&lt;/p&gt;&#xD;
&lt;p&gt;隐式强类型并不能有效简化我的书写的代码，但当我们在用它来动态接收一些未知类型的数据的时候就显虽得很强大。在隐式强类型变量出现前，我们一般是使用object型变量来接收这种未知类型的数据的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;2.对象初始化&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;这个功能可以&lt;strong&gt;有效简化类的getter和setter部份的代码&lt;/strong&gt;，还可以&lt;strong&gt;只使用一行表达式语句实现对象的实例化与初始化操作&lt;/strong&gt;。&lt;br /&gt;如定义实例类时可以使用如下代码，没有必要再把成员变量和属性分别定义了。&lt;br /&gt;&lt;font color="#0000ff"&gt;public class LineItem&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;public int OrderID { get; set; }&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt; public int ProductID { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public short Quantity { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string QuantityPerUnit { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public decimal UnitPrice { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public float Discount { get; set; }&lt;br /&gt;&lt;/strong&gt;} &lt;br /&gt;&lt;/font&gt;实例化LineItem对象，并为它赋值&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;var line3 = new LineItem { OrderID = 11000, ProductID = 61, Quantity = 30, QuantityPerUnit = &amp;#8220;12 1-kg cartons&amp;#8221;, UnitPrice = 15.55M, Discount = 0.15F };&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;3.数组初始化&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var LineItems = new[] &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new LineItem {OrderID = 11000, ProductID = 11, Quantity = 10, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QuantityPerUnit = &amp;#8220;24 500-g bottles&amp;#8221;, UnitPrice = 15.55M, Discount = 0.0F},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new LineItem {OrderID = 11000, ProductID = 21, Quantity = 20, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QuantityPerUnit = &amp;#8220;12 1-kg cartons&amp;#8221;, UnitPrice = 20.2M, Discount = 0.1F},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new LineItem {OrderID = 11000, ProductID = 31, Quantity = 30, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QuantityPerUnit = &amp;#8220;24 1-kg bags&amp;#8221;, UnitPrice = 25.45M, Discount = 0.15F} &lt;br /&gt;};&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;4.集合初始化&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var LineItemsList = new List &amp;lt; LineItem &amp;gt; &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new LineItem {OrderID = 11000, ProductID = 11, Quantity = 10, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QuantityPerUnit = &amp;#8220;24 500-g bottles&amp;#8221;, UnitPrice = 15.55M, Discount = 0.0F}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new LineItem {OrderID = 11000, ProductID = 21, Quantity = 20, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QuantityPerUnit = &amp;#8220;12 1-kg cartons&amp;#8221;, UnitPrice = 20.2M, Discount = 0.1F}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new LineItem {OrderID = 11000, ProductID = 31, Quantity = 30, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QuantityPerUnit = &amp;#8220;24 1-kg bags&amp;#8221;, UnitPrice = 25.45M, Discount = 0.15F} &lt;br /&gt;};&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;5.匿名类型&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;过去我们要生成对象时，必须事先定义该对象的类，然后使用new关键字来实例化该类。匿名类型简化定义类的这个过程，我们&lt;strong&gt;可以使用new关键字直接把类的定义，类的实例化放在一个表达式语句中&lt;/strong&gt;。&lt;br /&gt;如：&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;var obj = new&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = "zhangsan",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = 18,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; URL = "&lt;/strong&gt;&lt;/font&gt;&lt;a href="http://hi.baidu.com/grayworm"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;http://hi.baidu.com/grayworm&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;"&lt;br /&gt;};&lt;br /&gt;&lt;/strong&gt;Console.WriteLine(obj.Name + obj.Age + obj.URL);&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;匿名类型主要用在LinQ to SQL中对字段的投影功能上：&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;var query = from i in LineItems select new { i.OrderID, i.ProductID, i.UnitPrice }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;6.扩展方法&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;扩展方法就是为现有的类追加我们自定义的方法。&lt;/strong&gt;在C#3.0的集成开发环境中，我们会发现带有向下箭头的方法，这些方法是我们在C#2.0中所没有见到的方法，这些方法就是我们所谓的&amp;#8220;扩展方法&amp;#8221;，它是C#3.0在C#2.0的基础上新增的一系列的方法，当然我们也可以为内置类添加我们自己的主扩展方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/e0c77ea83250b885ca130c0f.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图2》&lt;br /&gt;例如在string中有个Length()扩展方法，它用来取得字符串的长度，但当字符串是null的时候调用该字符串的Length()时候会抛出异常。下面我们为String类添加一个自定义的方法LengthNullable()，如果字符串为null不抛出异常，而返回-1：&lt;br /&gt;代码如下：&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;static&lt;/strong&gt; class ExtensionMethods&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;public static&lt;/strong&gt; int LengthNullable(&lt;strong&gt;this string test&lt;/strong&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (test != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return test.Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;} &lt;br /&gt;&lt;/font&gt;&lt;strong&gt;C#3.0的扩展方法需要单独写在一个public static的类中，并且扩展方法也应当用public static修饰。扩展方法的参数有三部份组成（this string test），第一部份是this关键字，它用来告诉编译器该方法是扩展方法；第二部份是该方法要追加到哪个类上，上面的例子代表该LengthNullable方法要追加到string类中去；第三部份是该类的实例名。&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;public static&lt;/strong&gt; class ExtentionMethods&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;public static&lt;/strong&gt; void Sleep(&lt;strong&gt;this Ren r&lt;/strong&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(r.Name+" is sleeping.....");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;public class Ren&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Age { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Speak()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(Name + Age);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;如果扩展方法与实例方法重名了，那在调用的时候只会调用到实例方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;7.匿名方法&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;在C#2.0中就存在匿名方法，但很少有程序员去使用匿名方法，因为它的语法有些怪异。匿名方法的主要用法：使用代理来替代一些简单的方法。&lt;br /&gt;大家都知道代理是指向方法的指针。如：&lt;br /&gt;&lt;font color="#0000ff"&gt;//声明代理&lt;br /&gt;delegate void Delegate(int x);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;//定义方法&lt;br /&gt;void &lt;strong&gt;DoSomething&lt;/strong&gt;(int y) { /* Something */ };&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;//把代理指向方法&lt;br /&gt;Delegate d = obj.&lt;strong&gt;DoSomething&lt;/strong&gt;;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里的方法有方法名--DoSomething，而匿名方法可以让代理直接指向一个没有名子的方法。如：&lt;br /&gt;&lt;font color="#0000ff"&gt;//声明代理&lt;br /&gt;delegate void Delegate(int x);&lt;br /&gt;//把代理指向一个匿名方法。&lt;br /&gt;Del d = &lt;strong&gt;delegate(int y) { /* Do Something */ };&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;匿名方法可以使代码变得更紧凑、更清晰、占用更少的资源。由于匿名方法与代理的关系很密切，所以有的人也称之为&amp;#8220;匿名代理&amp;#8221;。&lt;br /&gt;&lt;strong&gt;在泛型集合List&amp;lt;T&amp;gt;中就有几个方法Exists()、Find()、FindAll()、RemoveAll()等方法，在Array类中也有类似的方法。&lt;/strong&gt;这些方法都能够对泛型集合进行简单的查询操作，它们的方法签名如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/100864dde45449ed8c102910.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图3》&lt;br /&gt;每个方法中都有个参数Predicate&amp;lt;T&amp;gt;，这个参数是个泛型代理，用来筛选数据。&lt;br /&gt;如果不使用匿名方法，那我们得这样编写代码：&lt;br /&gt;&lt;font color="#0000ff"&gt;static bool &lt;strong&gt;HighUnitPrice&lt;/strong&gt;(&lt;strong&gt;LineItem i&lt;/strong&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i.UnitPrice &amp;gt; 25M)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;}&lt;br /&gt;LineItem obj = &lt;strong&gt;Array.Find(LineItems, HighUnitPrice);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;先定义一个方法HighUnitPrice(LineItem i)，然后在Array.Find()的参数Predicate&amp;lt;T&amp;gt;中调用该方法。&lt;/strong&gt;如果有了匿名方法就不用再单独定义HighUnitPrice(LineItem i)方法了。&lt;br /&gt;如：&lt;br /&gt;&lt;font color="#0000ff"&gt;var anon = LineItemsList.Find( &lt;br /&gt;&lt;strong&gt;delegate(LineItem i)&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp; return i.UnitPrice &amp;gt; = 25M; &lt;br /&gt;}&lt;/strong&gt; &lt;br /&gt;);&lt;br /&gt;&lt;/font&gt;在C#3.0中的好多地方都用到了匿名方法，&lt;strong&gt;匿名方法是理解Lambda表达式的基础。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;8. Lambda表达式&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Lambda表达式就是用很少的代码来实现匿名方法。&lt;br /&gt;&lt;/strong&gt;语法格式：&lt;br /&gt;&lt;strong&gt;&lt;font color="#990000"&gt;参数列表=&amp;gt;表达式&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面我们来看看如何把匿名方法转换为Lambda表达式：&lt;br /&gt;匿名方法：&lt;br /&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;delegate(LineItem i) { return i.UnitPrice &amp;gt;= 25M; } &lt;br /&gt;&lt;/font&gt;第一步：删除关键字delegate，变为&lt;/strong&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;(LineItem i) { return i.UnitPrice &amp;gt;= 25M; } &lt;br /&gt;&lt;/font&gt;第二步：把花括号{}替的换为Lambda运算符=&amp;gt;，变为 &lt;/strong&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;(LineItem i) =&amp;gt; return i.UnitPrice &amp;gt;= 25M;&lt;br /&gt;&lt;/font&gt;第三步：去掉return和分号，语句变成表达式 &lt;/strong&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;(LineItem i) =&amp;gt; i.UnitPrice &amp;gt;= 25M&lt;br /&gt;&lt;/font&gt;第四步：由于编译器会自动进行类型推断，所以我们还可以把LineItem去掉。&lt;/strong&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt; i =&amp;gt; i.UnitPrice &amp;gt;= 25M&lt;br /&gt;&lt;/font&gt;这样就把匿名方法变成了Lambda表达式。&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;var anon = LineItemsList.Find( i = &amp;gt; i.UnitPrice &amp;gt; = 25M );&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;由此可见Lambda表达式是由Lambda运算符分割开的两部份组成。右边部分代表运算的语句块，左边部分代表的是运算需要的参数。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;9.标准查询操作(Standard Query Operators SQO)&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;标准查询操作是对IEnumerable&amp;lt;T&amp;gt;接口追加的一系列的扩展方法。通过这些扩展方法对实现IEnumerable&amp;lt;T&amp;gt;接口的集合、数组进行一系列的查询操作。&lt;/strong&gt;一些比较常用的扩展方法有&lt;strong&gt;Where()/OrderBy()/Select()等&lt;/strong&gt;，LinQ标准查询操作我们将在后面详细阐述。&lt;br /&gt;&lt;strong&gt;LinQ中的from关键字并不是扩展方法，因此它不是SQO。&lt;/strong&gt;from只是为in关键字后的序列指定一个别名。&lt;br /&gt;C#3.0的查询表达式是以一个或多个&amp;#8220;from 别名 in 序列名&amp;#8221;子句开始，以select或group子句结束。而join/let/where/orderby等子句是可选的，需要写在from和select/group子句中间。&lt;/p&gt;&#xD;
&lt;p&gt;下面是对内存中List&amp;lt;productList&amp;gt;集合进行查询的例子&lt;br /&gt;&lt;font color="#0000ff"&gt;var noStock = from p in productList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where p.UnitsInStock == 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; orderby p.Category, p.ProductID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select new { p.ProductID, p.Category, p.ProductName };&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;编译器会自动把上面的表达式语句翻译成下面的链式方法调用，在链式方法调用中使用的就是lambda表达式&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;var noStock = productList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(p = &amp;gt; p.UnitsInStock == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .OrderBy(p = &amp;gt; p.Category)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ThenBy(p = &amp;gt; p.ProductID)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(p = &amp;gt; new { p.ProductID, p.Category, p.ProductName }); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;10.IQueryable&amp;lt;T&amp;gt;接口&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;IQueryable&amp;lt;T&amp;gt;类型不是集合，他们是支持多态、优化、动态查询功能的LinQ查询序列，它能够把标准化查询操作（SQO）转换成表达式树。&lt;font color="#ff0000"&gt;简而言之，IQueryable&amp;lt;T&amp;gt;接收的对象不是集合，而是查询表达式树。&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;我们可以使用IQueryable&amp;lt;T&amp;gt;的&lt;strong&gt;ToList()方法来把查询序列变成List&amp;lt;T&amp;gt;类型&lt;/strong&gt;，使用&lt;strong&gt;ToArray()方法把查询序列变成数组类型。&lt;br /&gt;IEnumerable&amp;lt;T&amp;gt;接口中有个AsQueryable()方法，该方法返回的是也IQueryable&amp;lt;T&amp;gt;类型。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;LinQ to Objects是LinQ家庭的核心，其它的LinQ也使用了与LinQ to Objects相同的查询句法。&lt;strong&gt;最终编译器都是把LinQ句法翻译成扩展方法的链式表达式，同时把扩展方法中的lambda表达式转换成匿名类中的匿名方法，然后再把查询表达式编译成MSIL。&lt;br /&gt;LinQ to SQL、LinQ to DataSets、LinQ to Entities和LinQ to XML则不是把查询表达式转换成MSIL，而是把查询表达式树转换成相应的特定查询语言。LinQ to SQL会生成T-SQL，LinQ to Entities会生成eSQL，LinQ to XML会生成XPath语句等。&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;LinQ标准查询操作符列表&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/661300ed682d45e0b21cb15f.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图1》&lt;/p&gt;&#xD;
&lt;p&gt;在VS2008及以后的版本中提供了LinQ的查询样例程序。&lt;br /&gt;\Programe Files\Microsoft Visual Studio 2008(10.0 VS2010)\Samples\1033文件夹下有个压缩包CSharpSamples.zip，解压它，继续打开其中的文件夹&lt;br /&gt;.\LinqSamples\SampleQueries\SampleQueries.sln，打开此解决方案，运行该项目，界面如下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img style="width: 890px; height: 661px"  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/dbae833d8590f5f39e3d6258.jpg" width="890" height="661" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图2》&lt;br /&gt;在左边选择示例，右侧上方会出现相应的LinQ代码，右侧下方会出现代码的运行结果。通过这个样例程序，我们可以学习LinQ的各种用法。&lt;/p&gt;&#xD;
&lt;p&gt;下面我们来学习LinQ常用操作符&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;一、筛选操作符Where&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;根据谓词对源序列的内容进行筛选，类似于SQL中的where子句。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;1.简单where表达式&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var query1 = CustomerList&lt;strong&gt;.Where(c =&amp;gt; c.Country == &amp;#8220;USA&amp;#8221;);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;query1 = from c in CustomerList &lt;strong&gt;where c.Country == &amp;#8220;USA&amp;#8221; select c&lt;/strong&gt;;&lt;br /&gt;&lt;/font&gt;使用扩展方法需要向where方法中传入lambda表达式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;2.复合where表达式&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;所谓的复合where表达式就是&lt;strong&gt;使用&amp;amp;&amp;amp;或||操作符对数据进行筛选&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var query2 = CustomerList.&lt;strong&gt;Where(c =&amp;gt; c.Country == &amp;#8220;USA&amp;#8221; &amp;amp;&amp;amp;&amp;nbsp;&amp;nbsp; c.Orders.Any())&lt;/strong&gt;;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;query2 = from c in CustomerList &lt;strong&gt;where c.Country == &amp;#8220;USA&amp;#8221; &amp;amp;&amp;amp;&amp;nbsp;&amp;nbsp; c.Orders.Any() select c&lt;/strong&gt;;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Any()方法相当于Count()&amp;gt;0，如果集合中有元素就返回true。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;3.使用Index参数和IndexOf()方法&lt;br /&gt;&lt;/font&gt;index值代表的是集合中元素的索引号，在where()中使用index可以控制返回与指定索引号相关的集合数据。&lt;/strong&gt;泛是返回IEnumerable&amp;lt;T&amp;gt;类型的查询操作都可以使用index。&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var query3 = CustomerList&lt;strong&gt;.Where((c, index) =&amp;gt; c.Country == &amp;#8220;USA&amp;#8221; &amp;amp;&amp;amp;&amp;nbsp;&amp;nbsp; index&amp;nbsp;&amp;nbsp; &amp;gt; 70);&lt;/strong&gt;//返回国家是USA，索引号大于70的元素集合。&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;这里lambda表达式中接收的参数是(c,index)，索引号做为第二个参数传入。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;也可以使用IndexOf()方法来实现上面的功能&lt;/strong&gt;，如果使用IndexOf()的话，那lambda表达式中传入的参数只需要一个就可以了。&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var query3 = CustomerList.&lt;strong&gt;Where(c =&amp;gt; c.Country == &amp;#8220;USA&amp;#8221; &amp;amp;&amp;amp; CustomerList.IndexOf(c) &amp;gt; 70);&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;query3 = from cust in CustomerList &lt;strong&gt;where cust.Country == &amp;#8220;USA&amp;#8221;&amp;amp;&amp;amp; CustomerList.IndexOf(cust) &amp;gt; 70&lt;/strong&gt; select cust;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;br /&gt;二、投影运算符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;投影运算符对应SQL中的&amp;#8220;select 列名&amp;#8221;子句&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（一）Select&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;Select操作符是从序列源返回一组指定属性&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var infos = context.Infos.Where(p =&amp;gt; p.Sex == true&lt;strong&gt;).Select(p =&amp;gt; new { p.Name,p.Sex});&lt;br /&gt;&lt;/strong&gt;foreach (var c in infos)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(c.Name + c.Sex);&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;使用查询表达式语法&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var infos = from p in context.Infos where p.Sex == true &lt;strong&gt;select new { p.Name, p.Sex };&lt;br /&gt;&lt;/strong&gt;foreach (var c in infos)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(c.Name + c.Sex);&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;如果使用扩展方法则在Select()方法中使用lambda表达式p=&amp;gt;new {p.Name,p.Sex}来对列进行投影；如果使用查询表达式语法的话，直接在select关键字后使用匿名类new { p.Name, p.Sex }即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）SelectMany&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;SelectMany操作符实际上实现的是相关数据的交叉连接操作。它根据lambda表达式从一对多的序列中返回指定的属性。&lt;br /&gt;&lt;/strong&gt;比如：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/1b2183178d50a93dc83d6d2f.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图3》&lt;br /&gt;&lt;strong&gt;查询男员工的所有家庭成员：&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = context.Infos.Where(p =&amp;gt; p.Sex == true).&lt;strong&gt;SelectMany(&lt;font color="#ff0000"&gt;f=&amp;gt;f.Families&lt;/font&gt;);&lt;br /&gt;&lt;/strong&gt;foreach (var n in q)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(n.Name);&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = from p in context.Infos where p.Sex==true &lt;strong&gt;from &lt;font color="#ff0000"&gt;f&lt;/font&gt; in &lt;font color="#ff0000"&gt;p.Families&lt;/font&gt; select &lt;font color="#ff0000"&gt;f&lt;/font&gt;;&lt;br /&gt;&lt;/strong&gt;foreach (var n in q)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(n.Name);&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;font color="#000000"&gt;三、&lt;/font&gt;分块操作符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="3"&gt;（一）Skip和Take&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Skip是从序列中跳过元素的个数；Take是从序列中获取元素的个数；&lt;br /&gt;&lt;/strong&gt;如：跳过集合的前2个元素，从第三个元素开始向后取4个元素。&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = list.&lt;strong&gt;Skip(2).Take(4);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = (from p in list select p).&lt;strong&gt;Skip(2).Take(4);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）SkipWhile和TakeWhile&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;SkipWhile：条件跳过，从序列第一个元素开始依次判断，一直跳到不满足条件的元素为止，返回此元素及此元素之后的序列 ;&lt;br /&gt;TakeWhile：条件抓取，从序列第一个元素开始依次判断，只要满足条件就进行下个元素判断，直到不满足条件的元素为止，返回此元素之前的序列 ;&lt;br /&gt;如：取集合中第一批&amp;#8220;性别&amp;#8221;是&amp;#8220;男&amp;#8221;的元素的集合。&lt;br /&gt;使用扩展方法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = list.&lt;strong&gt;SkipWhile(p =&amp;gt; p.Sex == false).TakeWhile(p =&amp;gt; p.Sex == true);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = (from p in list select p).&lt;strong&gt;SkipWhile(p =&amp;gt; p.Sex == false).TakeWhile(p =&amp;gt; p.Sex == true);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;四、连接运算符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Join和GroupJoin操作符是把两个相互独立的对象通过关键属性关联起来。&lt;/strong&gt;这种对象与对象的关联与SQL中的Join关联语法上有些不同。&lt;br /&gt;&lt;strong&gt;1.LinQ的Join不支持SQL-92中的一些比较运算符，如&amp;gt;、&amp;lt;、&amp;lt;&amp;gt;等。它只支持相等运算符&lt;br /&gt;2.在On子句中不能使用=来实现两个对象之间的关联，需要使用Equals运算符。&lt;br /&gt;&lt;font size="3"&gt;（一）Join&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var list = infos.&lt;strong&gt;Join(works, p =&amp;gt; p.Code, w =&amp;gt; w.InfoCode, (p, w) =&amp;gt; new { p.Name, w.Firm, w.Depart });&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var list = from p in infos &lt;strong&gt;join w in works on p.Code equals w.InfoCode&lt;/strong&gt; select new { p.Name, w.Firm, w.Depart };&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）GroupJoin&lt;br /&gt;&lt;/font&gt;可以实现外联效果&lt;/strong&gt;&lt;br /&gt;Join扩展方法与GroupJoin扩展方法签名有些不一样&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img style="width: 890px; height: 218px"  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/3cad53d85fd17f0132fa1ca8.jpg" width="890" height="218" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图4》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img style="width: 890px; height: 119px"  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/0e109aa2ab05ff99caefd0aa.jpg" width="890" height="119" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图5》&lt;br /&gt;在C#3.0&lt;strong&gt;查询表达式语法&lt;/strong&gt;中没有GroupJoin语法，&lt;strong&gt;可以使用Join...into...来实现&lt;/strong&gt;，它与Join不同的是，它可以实现类似于SQL外联接的效果，而Join只实现类似于SQL内联的效果。&lt;br /&gt;&lt;strong&gt;使用查询表达式语法&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var list = from p in infos &lt;strong&gt;join&lt;/strong&gt; w in works on p.Code equals w.InfoCode&lt;strong&gt; into bo&lt;/strong&gt; from r in bo.DefaultIfEmpty() select new { p.Name, r};&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;五、连接运算符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Concat运算符用来把两个序列连接到一个序列中，它类似于SQL中的关系或or运算符。&lt;br /&gt;使用扩展方法&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = infos.Select(p=&amp;gt;p.Name).&lt;strong&gt;Concat(works.Select(w=&amp;gt;w.Firm));&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p.Name).&lt;strong&gt;Concat(from w in works select w.Firm);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;六、排序运算符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;排序运算符一共包含五个运算符&lt;font color="#0000ff"&gt;OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;OrderBy&lt;/strong&gt;：升序排序&lt;br /&gt;&lt;strong&gt;OrderByDescending&lt;/strong&gt;：降序排序&lt;br /&gt;&lt;strong&gt;ThenBy&lt;/strong&gt;：在OrderBy或OrderByDescending后实现多级排序中实现升序排序&lt;br /&gt;&lt;strong&gt;ThenByDescending&lt;/strong&gt;：在OrderBy或OrderByDescending后实现多级排序中实现降序排序&lt;br /&gt;&lt;strong&gt;Reverse&lt;/strong&gt;：顺序倒转&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;如：对所有人员先按照性别升序排序，再按照生日降序排序&lt;br /&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = infos.&lt;strong&gt;OrderBy(p =&amp;gt; p.Sex).ThenByDescending(p =&amp;gt; p.Birthday);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = from p in infos &lt;strong&gt;orderby p.Sex,p.Birthday descending select p;&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;在查询表达式语法中实现多级排序类似于T-Sql中的方式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;七、分组操作符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;分组操作符GroupBy用来按照元素的某个属性来对序列中的元素进行分组。&lt;strong&gt;类似于SQL中的group by 子句，但它是对象的序列，还可以获取每组中的每个元素对象。&lt;br /&gt;如：按照性别对人员进行分组，并显示每组中人员的信息&lt;br /&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = infos.&lt;strong&gt;GroupBy(p=&amp;gt;p.Sex);;&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = from m in infos&lt;strong&gt; group m by m.Sex into g&lt;/strong&gt; select g;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;显示分组数据：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;foreach (var item in q)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;//item.Key代表分组后的关键字的值，在这里是性别Sex的值&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("性别为"+&lt;strong&gt;item.Key&lt;/strong&gt;+"\t共有"+&lt;strong&gt;item.Count()&lt;/strong&gt;+"人");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (&lt;strong&gt;var c in item&lt;/strong&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("\t" + &lt;strong&gt;c.Name&lt;/strong&gt; + "\t" +&lt;strong&gt; c.Sex&lt;/strong&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("*********************");&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/b583e11882211b3335fa4182.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;《图6》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;八、集合操作符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;集合操作符包括&lt;font color="#0000ff"&gt;Distinct、Union、Intersect和Except&lt;/font&gt;，除了Distinct之外其余的三个是用来把两个集合拼合成一个集合。&lt;br /&gt;&lt;strong&gt;&lt;font size="3"&gt;（一）Distinct&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Distinct操作符用来把序列中重复的值移除掉，类似于SQL中的Distinct&lt;br /&gt;&lt;/strong&gt;如：查看Infos集合中所有&lt;br /&gt;&lt;strong&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = infos.Select(p =&amp;gt; p.Nation).&lt;strong&gt;Distinct();&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p.Nation).&lt;strong&gt;Distinct();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）Union&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Union操作符取两个具有相同结构的集合并集，如果两集合中有相同元素，则会自动滤去重复内容。而前面所讲的Concat操作符只是将两个集合进行合并，并不过滤重复元素。&lt;br /&gt;如：两个集合，其中temp是infos的子集。&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var infos = from p in context.Infos.ToList() select p;&lt;br /&gt;var temp = infos.Where(p =&amp;gt; p.Sex == true);&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = infos.&lt;strong&gt;Union(temp);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p).&lt;strong&gt;Union(from m in temp select m);&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;运行结果中，子集的内容并没有重复出现&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（三）Intersect&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Intersect操作符是取两个具有相同结构的集合的交集部份。&lt;br /&gt;如：两个集合，其中temp是infos的子集。&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var infos = from p in context.Infos.ToList() select p;&lt;br /&gt;var temp = infos.Where(p =&amp;gt; p.Sex == true);&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用扩展方法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = infos&lt;strong&gt;.Intersect(temp);&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p).&lt;strong&gt;Intersect(from m in temp select m);&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;运行结果中只显示子集中的内容。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（四）Except&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Except操作符是从一个集合中取另一个集合的差集，即从集合A中取出集合B中不包含的元素。&lt;br /&gt;如：两个集合，infos和temp，temp集合中包含了infos集合中不存在的元素&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var infos = from p in context.Infos.ToList() select p;&lt;br /&gt;var temp = infos.Where(p =&amp;gt; p.Sex == true).ToList();&lt;br /&gt;temp.Add(new Info&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Code = "p100",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = "哈哈",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sex = false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nation = "n004",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Birthday = DateTime.Now&lt;br /&gt;});&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = infos.&lt;strong&gt;Except(temp);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p).&lt;strong&gt;Except(from m in temp select m);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;九、转换操作符，用来改变集合的类型&lt;br /&gt;&lt;/font&gt;（一）ToArray&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;把集合转换为数组形式，不延迟&lt;br /&gt;使用扩展方法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Info[] g&lt;/strong&gt; = infos.&lt;strong&gt;ToArray();&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Info[] g&lt;/strong&gt; = (from p in infos select p).&lt;strong&gt;ToArray();&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）ToList&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;把集合转换为泛型集合形式，不延迟&lt;br /&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;List&amp;lt;Info&amp;gt; g&lt;/strong&gt; = infos&lt;strong&gt;.ToList();&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;List&amp;lt;Info&amp;gt; g&lt;/strong&gt; = (from p in infos select p).&lt;strong&gt;ToList();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（三）ToDictionary&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;把集合转换成Dictionary&amp;lt;TKey,TElement&amp;gt;类型的集合，它每个元素的value值是原集合中的一个元素对象。&lt;br /&gt;如：下面的代码把集合的内容转换为一个字典集合，字典的key值是人员代号，字典的value值是info元素对象。&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = infos&lt;strong&gt;.ToDictionary(p=&amp;gt;p.Code);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p).&lt;strong&gt;ToDictionary(p=&amp;gt;p.Code);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;调用语法&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;foreach (&lt;strong&gt;var item in q&lt;/strong&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;strong&gt;item.Key+&lt;font color="#ff0000"&gt;item.Value.Name&lt;/font&gt;&lt;/strong&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;从运行结果中我们可以看出，字典的第二个参数就是原集合中的元素。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（四）ToLookup&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;把集合转换成ILookup&amp;lt;TKey,TElement&amp;gt;类型的集合，&lt;/strong&gt;&lt;strong&gt;&lt;font color="#cc0000"&gt;ILookup&amp;lt;TKey,TElement&amp;gt;集合与Dictionary&amp;lt;TKey,TElement&amp;gt;集合不同的是：Dictionary&amp;lt;TKey,TElement&amp;gt;中Key和Value值一一对应，而ILookup&amp;lt;TKey,TElement&amp;gt;集合中Key和Value值是一对多的对应关系。&lt;br /&gt;&lt;/font&gt;如：使用ILookup&amp;lt;TKey,TElement&amp;gt;把集合中的元素分组显示&lt;br /&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = infos.ToLookup(p=&amp;gt;p.Nation);&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p).ToLookup(p =&amp;gt; p.Nation);&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;显示数据的代码：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;foreach (var item in q)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(item.Key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var single in item)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("\t" + single.Name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;显示效果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/b583e118820a1b3335fa4199.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图7》&lt;br /&gt;（原创：灰灰虫的家&lt;a href="http://hi.baidu.com/grayworm"&gt;http://hi.baidu.com/grayworm&lt;/a&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;十、相等操作符：SequenceEqual&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;用来对两个序列进行对比。&lt;strong&gt;如果所有元素的值相等，并且元素个数相等，并且元素的次序相等，那SequenceEqual操作符返回的是True，否则返回False&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var s1 = infos.OrderBy(p =&amp;gt; p.Code);&lt;br /&gt;var s2 = infos.OrderByDescending(p=&amp;gt;p.Code);&lt;br /&gt;var s3 = infos.OrderBy(p =&amp;gt; p.Code);&lt;br /&gt;Console.WriteLine(s1.SequenceEqual(s2)); //结果是False&lt;br /&gt;Console.WriteLine(s1.SequenceEqual(s3)); //结果是True&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;十一、元素操作符：&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;元素操作符的作用是从IEnumerable&amp;lt;T&amp;gt;集合序列中返回一个指定的元素。&lt;br /&gt;如果没有找到指定的元素，所有的XXXDefault操作符返回空对象，并不会产生异常。而First、Last、Single和ElementAt操作符则会产生异常。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（一）First和FirstOrDefault&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;如果序列中包含一个或多个元素，这两个操作符返回序列中的第一个元素。如果序列不包含任何元素，则FirstOrDefault操作符返回null值（引用类型）或默认值（值类型），而First操作符则产生异常信息。&lt;br /&gt;&lt;strong&gt;如：查找第一个女生&lt;br /&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var item = infos.First(p=&amp;gt;p.Sex == false);&lt;br /&gt;var item = infos.Where(p =&amp;gt; p.Sex == false).&lt;strong&gt;First();&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var item = (from p in infos where p.Sex == false select p).&lt;strong&gt;First();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）Last和LastOrdefault&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;如果序列中包含一个或多个元素，这两个操作符返回序列中的最后一个元素。如果序列不包含任何元素，则LastOrDefault操作符返回null值（引用类型）或默认值（值类型），而Last操作符则产生异常信息。&lt;br /&gt;&lt;strong&gt;如：查找最后一个女生&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var item = infos&lt;strong&gt;.Last(p=&amp;gt;p.Sex == false);&lt;/strong&gt;&lt;br /&gt;var item = infos.&lt;strong&gt;Where(p =&amp;gt; p.Sex == false).Last();&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var item = (from p in infos where p.Sex == false select p).&lt;strong&gt;Last();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（三）Single和SingleOrDefault&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;如果序列中有且只有一个元素，则这两个操作符返回该元素&lt;br /&gt;如果序列中没有任何元素，则Single会产生异常，而SingleOrDefault则会返回null值（引用类型）或默认值（值类型）&lt;br /&gt;如果序列中包含多个元素，则这两个操作符都会产生异常。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（四）ElementAt和ElementAtOrDefault&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;这两个操作符是根据索引号从序列中返回指定的元素，如果未找到元素ElementAt()会产生异常，而ElementAtOrDefault()则会返回默认实例。&lt;br /&gt;&lt;strong&gt;如：取出集合中的第二个女生&lt;br /&gt;使用扩展方法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var item = infos.Where(p=&amp;gt;p.Sex == false).&lt;strong&gt;ElementAt(2);&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var item = (from p in infos where p.Sex == false select p).&lt;strong&gt;ElementAt(2);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;十二、元素数量操作符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;判断序列中元素是否满足指定的条件返回bool型的值。带有该操作符的话句不能实现延迟查询，语句会被立即执行。&lt;br /&gt;&lt;strong&gt;（一）Any&lt;/strong&gt;&lt;br /&gt;如果序列中存在任一个满足条件的元素，就返回true&lt;br /&gt;&lt;strong&gt;如：判断是否存在代号为P005的人员&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = infos.&lt;strong&gt;Any(p=&amp;gt;p.Code == "p005");&lt;/strong&gt;&lt;br /&gt;var q = infos.&lt;strong&gt;Where(p =&amp;gt; p.Code == "p005").Any();&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos where p.Code == "p005").&lt;strong&gt;Any();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）All&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;如果序列中所有元素都满足条件，就返回true&lt;br /&gt;&lt;strong&gt;如：判断是否所有员工都是汉族&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用扩展方法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = infos.&lt;strong&gt;All(p =&amp;gt; p.Nation == "汉族");&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;使用查询表达式语法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos select p).&lt;strong&gt;All(p=&amp;gt;p.Nation == "汉族");&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（三）Contains&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;判断集合中是否包含指定的元素&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;十三、聚合操作符&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;聚合操作符类似于SQL中的聚合函数，所有带有聚合操作符的LinQ语句都无延迟功能，会被立即被执行。&lt;br /&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;br /&gt;（一）Count&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;取得序列中满足条件的元素的个数&lt;br /&gt;使用扩展方法：&lt;/strong&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = infos.&lt;strong&gt;Count(p =&amp;gt; p.Sex == false);&lt;br /&gt;&lt;/strong&gt;var q = infos.&lt;strong&gt;Where(p =&amp;gt; p.Sex == false).Count();&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;使用查询表达式语法：&lt;br /&gt;&lt;/strong&gt;&lt;font color="#0000ff"&gt;var q = (from p in infos where p.Sex==false select p).&lt;strong&gt;Count();&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;br /&gt;（二）Min、Max、Sum和Average&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;分别是取得序列中所有元素中某属性的最小值、最大值、总和、平均值等。&lt;br /&gt;&lt;font color="#0000ff"&gt;decimal? minFreightCharge = OrderList.&lt;strong&gt;Min&lt;/strong&gt;(c =&amp;gt; c.Freight);&lt;br /&gt;decimal? maxFreightCharge = OrderList.&lt;strong&gt;Max&lt;/strong&gt;(c =&amp;gt; c.Freight);&lt;br /&gt;decimal? sumFreightCharge = OrderList.&lt;strong&gt;Sum&lt;/strong&gt;(c =&amp;gt; c.Freight);&lt;br /&gt;decimal? avgFreightCharge = OrderList.&lt;strong&gt;Average&lt;/strong&gt;(c =&amp;gt; c.Freight);&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;总结：&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;这一篇文章主要介绍了LinQ的标准查询操作符（SQO）。对每个操作符都介绍了使用扩展方法的使用和查询表达式的使用，对于这两种用法大家应当都掌握住，尤其要记住扩展方法的使用。&lt;br /&gt;由于时间的原因没有对每个示例的运行结果抓图显示，朋友们可以自己测试一下结果。&lt;br /&gt;上面的内容是LinQ to Object的基础语法，也是其它LinQ的基础，熟练使用这些操作符能够使我们在LinQ天地中自由驰骋。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/strong&gt;LinQ to SQL可以用来取代传统的基于SQL语句的查询操作。在以后的数据访问层(DAL)中，我们可以使用LinQ to SQL实现数据库的CRUD操作，&lt;strong&gt;在执行的时候.net框架会把LinQ to SQL查询表达式转换成对应的SQL语句再去执行。&lt;/strong&gt;使用LinQ to SQL可以借助于LinQ语法大大简化我们数据访问的代码量，并且还具有编译检查、智能感知和强类型表达式等优点。&lt;br /&gt;&lt;strong&gt;LinQ to SQL从严格意义上来说不能算是一个ORM框架，它只对SQL Server起作用，并不能实现对各种关系型数据库进行透明的映射，所以我们通常把LinQ to SQL称为SQL Mapping框架。&lt;br /&gt;&lt;/strong&gt;LinQ to SQL都是对Table&amp;lt;TEntity&amp;gt;进行操作，&lt;strong&gt;对于&amp;#8220;一对多&amp;#8221;的关联（如：Customers.Orders）它会使用EntitySets集合类型的成员来表示&lt;/strong&gt;，&lt;strong&gt;而对于&amp;#8220;多对一&amp;#8221;的关联（如：Order.Customer）它会使用EntityRefs类型成员来表示。LinQ to SQL并不支持&amp;#8220;多对多&amp;#8221;的直接关联操作。&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;一、LinQ to SQL的ORM&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;LinQ to SQL不但仅仅实现了对象/关系之间的映射，还提供了一个简单易用的图形化界面工具。通过这个工具可以为SQL200X每个表生成一个实体类，并在底层有关联的表的实体类之间生成一个实体关联，把数据库中表和表之间的&amp;#8220;关联关系&amp;#8221;彻底转换为对象与对象之间的&amp;#8220;关联关系&amp;#8221;。通过此关联可以直接访问到该对象和与该对象相关联的其它对象，不用再通过Join子句来实现多表关联查询了。这种关联实体的功能是LinQ和实体框架的重要功能。&lt;br /&gt;这种把数据库中的表和外键封装成类和类之间的关联的优势在于开发人员可以把数据库中的抽象数据设计成现实生活中的对象，依照现实生活中的对象来管理代码世界中的对象数据。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;使用LinQ to SQL的图形化界面快速实现表与实体之间的映射&lt;/strong&gt;&lt;br /&gt;1.在项目中添加新项，选择"LinQ to SQL Classes"&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/9a3013ee2c9672cdb3fb95bd.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图1》&lt;br /&gt;2.打开&amp;#8220;服务器资源管理器(Server Explorer)&amp;#8221;选中要映射的表，并把它们拖到.dbml的设计器界面中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/efe4b1f2f3ecb425b17ec5bf.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图2》&lt;br /&gt;通过上面两步，不用写代码就可以实现出表与实体之间的映射。下面我们看看生成的代码结构。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/0f79d68254a6eb896d8119b8.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图3》&lt;br /&gt;从图中我们看出，在我们这简单的拖动过程中，VS为我们生成了三个文件：&lt;strong&gt;MyDB.dbml、MyDB.dbml.layout、MyDB.designer.cs&lt;br /&gt;&lt;/strong&gt;这三个类的代码分别如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/1c4b42fa5c3c0ea159ee90bb.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图4》&lt;br /&gt;&lt;strong&gt;MyDB.dbml-XML文件&lt;/strong&gt;，描述了表与实体之间的&lt;font color="#741b47"&gt;映射关系&lt;/font&gt;。如果我们直接从&amp;#8220;服务器资源管理器&amp;#8221;中向.dbml拖动表来使用LINQ的话，那些XML映射文件并不会起做用。因为LinQ还有映射方式：使用Attributes来映射，当我们从&amp;#8220;服务器资源管理器&amp;#8221;中直接拖动表到.dbml上去的时候，就是使用Attribute来映射的。在下面的MyDB.designer.cs文件中我们可以看到类和属性的上都带有Attributes属性，它用来描述实体类与表的映射关系。这种使用Attributes来实现映射，不是一种很好的映射方式，因为映射没有与代码完全分离，修改映射的过程本还需要对源代码进行修改，但这种使用LinQ的方式最为简单，所以也就成为大多数LinQ程序员的选择。&lt;br /&gt;&lt;strong&gt;MyDB.dbml.layout-XML文件&lt;/strong&gt;，描述了在LinQ to SQL图形化设计界面中图示的&lt;font color="#741b47"&gt;布局位置信息&lt;br /&gt;&lt;/font&gt;MyDB.designer.cs-CSharp源代码文件，根据数据库的表结构，生成的实体类和DataContext类。&lt;br /&gt;如果只从应用的角度上来讲，我们不用分析这三个文件的代码。但对于MyDB.designer.cs其中的类我们需要大体来看一下。&lt;br /&gt;&lt;strong&gt;MyDB.desinger.cs文件&lt;/strong&gt;中包含了系统&lt;font color="#741b47"&gt;自动生成的类&lt;/font&gt;，这些类大部份是数据库中表所对应的实体类，类的名子一般是以表名进行命名，如：Info,Family,Work,Nation,Title。另外还有一个类MyDBDataContext类，从字面意思上理解，该类是&amp;#8220;MyDB数据上下文&amp;#8221;，所谓的&amp;#8220;上下文&amp;#8221;就是指&amp;#8220;硬盘上的关系型数据库&amp;#8221;和&amp;#8220;内存中的实体对象&amp;#8221;，MyDBDataContext类的作用就是在&amp;#8220;硬盘上的关系型数据库&amp;#8221;和&amp;#8220;内存中的实体对象&amp;#8221;之间起一个桥梁的作用。这个类的代码中包含一系列的Table&amp;lt;TEntity&amp;gt;型的属性，可以使用它们来把数据库中记录的集合变换成内存中对象的集合，以便操作。&lt;br /&gt;在MyDB.desinger.cs文件的实体类中，包含诸多成员变量和属性的定义，这个成员变量除了对应于数据库中字段名，但还出现了EntitySet&amp;lt;TEntity&amp;gt;和EntityRef&amp;lt;TEntity&amp;gt;两种类型的成员变量，正如我们上面所讲到的，这两种类型的变量分别用于实现对象与对象之间的关联关系。&lt;font color="#741b47"&gt;EntitySet&amp;lt;TEntity&amp;gt;是实体集合的引用，它指向与当前对象相关联的其它实体集合（1:m）；EntityRef&amp;lt;TEntity&amp;gt;是实体对象引用，它指向与当前对象相关联的其它实体对象的引用（m:1）。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#741b47"&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/2582f6312b681c9e5edf0e82.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;《图5》&lt;br /&gt;上面是Info表的实体类，除了_Code,_Name,_Sex,_Nation,_Birthday等数据库字段变量外，还有_Families和_Works，这两个成员变量对应Family表和Work表中，与当前对象相关联的实体对象的集合；而_Nation1则是与当前对象相关联的民族实体对象。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;二、使用LinQ to SQL实现数据库的查询操作&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;LinQ to SQL的数据库操作是大多数程序员所钟情的功能，因为它能够把LinQ查询表达式自动转换为相应的SQL语句进行处理，这样就不用再花太多的时间去编写实体类和数据访问类了。LinQ to SQL的查询语句与LinQ to Objects语法很相似，只是LinQ to Objects是把LinQ表达式转换为中间语言，而LinQ to SQL是把LinQ表达式转换为SQL语句，送到数据库去执行。&lt;br /&gt;下面以一个简单的例子来展示一下LinQ to SQL的使用，具体语法请参照上一篇文章。&lt;br /&gt;&lt;strong&gt;示例：&lt;br /&gt;在Info表中查询回族男生和汉族的女生中姓张的同学的信息&lt;br /&gt;&lt;/strong&gt;第一步：新建MyDB.dbml，并从服务器资源管理器中把相应的表拖进MyDB.dbml&lt;br /&gt;第二步：添加新页面&lt;br /&gt;第三步：实例化MyDBDataContext对象&lt;br /&gt;&lt;font color="#0000ff"&gt;MyDBDataContext context = new MyDBDataContext();&lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;第&lt;/font&gt;三步：编写LinQ查询&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = from p in context.Infos where p.Name.StartsWith("张") &amp;amp;&amp;amp;((p.Nation == "n002" &amp;amp;&amp;amp; p.Sex == true) || (p.Nation == "n001" &amp;amp;&amp;amp; p.Sex == false) ) select p;&lt;br /&gt;&lt;/font&gt;或&lt;br /&gt;&lt;font color="#0000ff"&gt;var q = context.Infos.Where(p =&amp;gt; p.Nation == "n002").Where(p =&amp;gt; p.Sex == true).Concat(context.Infos.Where(p =&amp;gt; p.Nation == "n001").Where(p =&amp;gt; p.Sex == false)).Where(p=&amp;gt;p.Name.StartsWith("张"));&lt;br /&gt;&lt;/font&gt;第四步：把查询序列转换成集合，并显示结果&lt;br /&gt;&lt;font color="#0000ff"&gt;var list = q.ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Info item in list)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Console.WriteLine(item.Code + "\t" + item.Name + "\t" + (item.Sex.Value?"男":"女") + "\t" + item.Nation1.Name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;三、使用LinQ实现增、删、改操作&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="3"&gt;（一）添加操作&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;第一步：实例化DataContext对象&lt;br /&gt;&lt;font color="#0000ff"&gt;MyDBDataContext context = new MyDBDataContext();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第二步：生成实体对象&lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Info data = new Info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Code = "x004",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = "马大哈",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sex = false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nation = "n001",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Birthday = new DateTime(1989, 12, 28)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第三步：向DataContext对象的Table&amp;lt;TEntity&amp;gt;集合中注册添加上一步中生成的实体对象&lt;br /&gt;&lt;font color="#0000ff"&gt;context.Infos.InsertOnSubmit(data);&lt;br /&gt;&lt;/font&gt;也可以使用Table&amp;lt;TEntity&amp;gt;集合的InsertAllOnSubmit(IEnumberable&amp;lt;T&amp;gt;)方法一次注册添加多个新对象，以便一次性向数据库插入这些数据。&lt;/p&gt;&#xD;
&lt;p&gt;第四步：使用DataContext对象提交更改&lt;br /&gt;&lt;font color="#0000ff"&gt;context.SubmitChanges();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）修改操作&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;第一步：实例化DataContext对象&lt;br /&gt;&lt;font color="#0000ff"&gt;MyDBDataContext context = new MyDBDataContext();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第二步：使用DataContext对象查询数据库中需要修改的内容，返回对应的实体对象&lt;br /&gt;&lt;font color="#0000ff"&gt;Info data = context.Infos.Where(p =&amp;gt; p.Code == "x004").First();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第三步：修改上一步中实体对象中的值&lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data.Name = "马也";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data.Sex = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data.Nation = "n002";&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第四步：使用DataContext对象提交更改&lt;br /&gt;&lt;font color="#0000ff"&gt;context.SubmitChanges();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;修改数据时，由于要修改的数据本身就是数据库中现有的数据，所以不用像插入操作那样使用context.Infos.InsertOnSubmit(data)注册数据，直接修改数据并提交更改即可，&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（三）删除操作&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;第一步：实例化DataContext对象&lt;br /&gt;&lt;font color="#0000ff"&gt;MyDBDataContext context = new MyDBDataContext();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第二步：使用DataContext对象查询数据库中需要修改的内容，返回对应的实体对象&lt;br /&gt;&lt;font color="#0000ff"&gt;Info data = context.Infos.Where(p =&amp;gt; p.Code == "x004").First();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第三步：向DataContext对象的Table&amp;lt;TEntity&amp;gt;集合中注册删除上一步中查出的对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;context.Infos.DeleteOnSubmit(data);&lt;br /&gt;&lt;/font&gt;也可以使用Table&amp;lt;TEntity&amp;gt;集合的DeleteAllOnSubmit(IEnumberable&amp;lt;T&amp;gt;)方法一次注册删除多个新对象，以便一次性向数据库删除这些数据。&lt;/p&gt;&#xD;
&lt;p&gt;第四步：使用DataContext对象提交更改&lt;br /&gt;&lt;font color="#0000ff"&gt;context.SubmitChanges();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面的增、删、改查代码只有在context.SubmitChanges()调用的时候才提交数据库执行对应操作。&lt;strong&gt;我们可以在执行context.SubmitChanges()之前编写多项数据的增、删、改代码，然后使用context.SubmitChanges()实现一次性提交。&lt;/strong&gt;context.SubmitChanges()方法自身带有事务功能，我们不必手动编写事务实现数据库的修改。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;四、使用LinQ调用存储过程&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;在开发人员与DBA之间总是存在一种争论：使用在程序中使用存储过程是不是一种较好的解决方案？下面我们从四方面来看一下：&lt;br /&gt;&lt;strong&gt;1.访问控制：&lt;/strong&gt;&lt;br /&gt;如果使用存储过程，可以为数据库创建自定义的用户或角色，并授权他们访问指定的存储过程，以提高数据操作的安全性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.SQL注入攻击&lt;/strong&gt;&lt;br /&gt;这种攻击通常是在执行动态SQL语句的时候发生，保存动态SQL语句的变量被恶意用户利用，通过输入的内容与原有SQL语句进行组合形成新的、具有攻击性的语句来对数据库操作。LinQ to SQL使用参数化查询方式来使用动态T-SQL语句，这种参数化的T-SQL语句能够很好的避免SQL注入攻击。所以&lt;strong&gt;并不是只有存储过程才能够解决SQL注入攻击&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.性能&lt;/strong&gt;&lt;br /&gt;在SQL Server6.5或更早版本中，对存储过程可以实现部份编译的功能，当调用存储过程的时候可以加快SQL代码执行速度。在SQL Server7.0和以后的版本中对于存储过程和SQL语句都具有编译功能。因此，一般说来在SQL Server7.0以后的数据库版本，&lt;strong&gt;存储过程的执行与参数化的SQL代码执行效率没有什么太大的区别&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4.结构独立性&lt;/strong&gt;&lt;br /&gt;如果数据库的结构发生了变化，那与之相关的存储过程也需要重新编写、测试。如果软件升级时，不但需要重新编写、测试存储过程，还需要涉及到存储过程的更新。如果使用DAL来实现数据库操作的话，可以借助于代码生成工具，来实现数据访问代码的&amp;#8220;半自动修改&amp;#8221;，使用DAL层可以把数据库结构改变的影响控制在一个有限的局部范围内。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（一）添加存储过程&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;从服务器资源管理器中把存储过程直接拖放到.dbml界面中，在界面的右侧会出现相应的存储过程。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/f0af2406e183224d02088191.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图6》&lt;br /&gt;右击.dbml界面中的存储过程，点击&amp;#8220;属性&amp;#8221;，打开属性面版，可以在这里修改存储过程的属性，在这里我们修改比较多的是&lt;strong&gt;Return Type&lt;/strong&gt;，它代表存储过程的返回类型。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/68a07ffa59d553bf9e514692.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图7》&lt;br /&gt;在这个拖动过程中，会在.designer.cs中生成两段代码：&lt;strong&gt;一段是实体类&lt;/strong&gt;，&lt;strong&gt;用来代表存储过程用到的实体对象（这个类只在调用增、删、改的存储过程中出现），如图8；另一段是在DataContext类中，用来实现存储过程的调用&lt;/strong&gt;，如图9。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/b070db23d0c68972ad34de9d.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图8》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/a772e76e6ed879ec81cb4a9e.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图9》&lt;br /&gt;下面我们来看如何使用存储过程实现CRUD的操作。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（二）使用存储过程实现查询操作&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;1.把存储过程拖到.dbml界面中去。&lt;br /&gt;2.编写代码调用存储过程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/fa8443f7894cb014720eec98.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图10》&lt;br /&gt;在调用存储过程中，可以直接使用DataContext调用对应的存储过程调用方法，如果存储过程需要参数的话，我们可以把参数值直接传递给方法。&lt;br /&gt;&lt;strong&gt;在LinQ中存储过程调用默认返回的类型是ISingleResult&amp;lt;T&amp;gt;类型&lt;/strong&gt;，它实现了IEnumerable&amp;lt;T&amp;gt;接口，可以使用ToList()方法把结果转换为List&amp;lt;T&amp;gt;，也可以直接绑定到ObjectDataSource控件中。ISingleResult&amp;lt;T&amp;gt;&lt;strong&gt;很像Table&amp;lt;TEntity&amp;gt;但比Table&amp;lt;TEntity&amp;gt;更简单一些。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;（三）使用存储过程实现增、删、改操作&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;使用存储过程实现增、删、改操作可以有两种方式来实现：&lt;strong&gt;一种是使用DataContext对象直接调用存储过程调用方法。另一种是修改实体类的默认方法，把增、删、改操作默认方法指定为相当的存储过程。&lt;br /&gt;第一种方法，使用DataContext对象直接调用存储过程的调用方法&lt;/strong&gt;&lt;br /&gt;1.把存储过程拖到.dbml界面中去。&lt;br /&gt;2.编写代码调用存储过程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/fa8443f78973b014720eec9b.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图11》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;第二种方法，修改实体类的默认方法 &lt;br /&gt;&lt;/strong&gt;1.把存储过程拖到.dbml界面中去。&lt;br /&gt;2.在.dbml文件中相应实体类上右击，选择&amp;#8220;属性&amp;#8221;，打开属性面版。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/8f5dc88b2b3c80e5fc1f1064.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图12》&lt;br /&gt;3.在属性面版的Default Methods类别中单击相应的方法，打开对话框。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/8a749f39812412c53b87ce66.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图13》&lt;br /&gt;在class下拉列表中选择要操作的实体类，在Behavior下拉列表中选择要对表进行的操作，在Customize下拉列表中选择对应的存储过程，在最下面的二维表格中选择存储过程参数与类的属性的对应关系。&lt;br /&gt;4.编写代码对数据库进行增、删、改操作&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/239ab2dc4e259297cc116667.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图14》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;五、使LinQDataSource数据源控件&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;在Web应用程序中，可以使用数据源控件来向界面提供绑定的数据。LinQ to SQL能够为两种数据源对象提供数据：&lt;strong&gt;ObjectDataSource和LinqDataSource&lt;/strong&gt;。&lt;br /&gt;&lt;strong&gt;LinqDataSource控件是VS2008中的新增的数据源控件，它只能绑定到LinQ to SQL的&lt;/strong&gt;DataContext.Table&amp;lt;TEntity&amp;gt;对象。用它向Web控件提供数据，并可以实现对数据的排序和分页操作。使用GridView、DetailsView、FormView等控件与LinqDataSource控件绑定的时候，不需要编写代码就可以实现数据的插入、修改、删除操作。&lt;br /&gt;ObjectDataSource控件也可以使用LinQ to SQL获取数据，因为DataContext.Table&amp;lt;TEntity&amp;gt;对象实现了IEnumerable&amp;lt;T&amp;gt;接口。当然我们也可以把Table&amp;lt;TEntity&amp;gt;对象转换成其它集合对象实现绑定。&lt;br /&gt;下面我们一起来看一下，如何使用LinQ to SQL来实现数据绑定&lt;br /&gt;第一步：添加LinQ to SQL类文件.dbml，并从&amp;#8220;服务器资源管理器&amp;#8221;拖动表到.dbml设计界面，生成LinQ to SQL类。&lt;br /&gt;第二步：从工具箱中把LinqDataSource控件拖到界面中来。&lt;br /&gt;第三步：在LinqDataSource控件的智能菜单中单击&amp;#8220;配置数据源&amp;#8221;，打开配置向导窗口。&lt;br /&gt;第四步：在"Choose your context object"下拉列表中选择***DataContext。点击&amp;#8220;Next&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/f791e6af7df58bfa7dd92a62.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图15》&lt;br /&gt;第五步：在Table下拉列表中选择要在界面中显示的Table集合，在下面的列的列表中选择要显示的列。点击&amp;#8220;Next&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/71b6388be4399124c9fc7a63.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图16》&lt;br /&gt;第六步：（可选）如果想获取表中一部份数据的话，点击右侧的where按钮，在弹出对话框中来配置where表达式。这个配置界面与SqlDataSource和ObjectDataSource控件很像，在此不多说了。点击&amp;#8220;OK&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/22f645b3cc0e6a91d8335a6c.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图17》&lt;br /&gt;第七步：（可选）如果要对显示的数据进行排序的话，请在图16中点击&amp;#8220;OrderBy&amp;#8221;按钮，在弹出对话框中设置排序规则。点击&amp;#8220;OK&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/1865371e7d3626c21ad5766f.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图18》&lt;br /&gt;第八步：（可选）如果想让LinqDataSource控件具有增、删、改的功能，在图16中点击&amp;#8220;Advanced&amp;#8221;按钮，在弹出下面对话框，在对话框中有三个复选框，只要选中它们，就可以实现增、删、改的功能。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/3e8185fcc339a2b4b801a069.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图19》&lt;br /&gt;第九步：点击&amp;#8220;Finish&amp;#8221;按钮完成配置工作。&lt;br /&gt;第十步：从工具箱中拖GridView到界面中来，设置DataSourceID为上面的LinqDataSource控件的ID。运行页面，出现效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/71b6388be43f9124c9fc7a69.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图20》&lt;/p&gt;&#xD;
&lt;p&gt;从图20中我们可以看出，表中的数据都被显示出来了，但是&amp;#8220;Nation&amp;#8221;这一列中显示的是代号，因为这一列是外键列，如何把它显示成民族名称呢。&lt;br /&gt;在上面绑定数据的基础上，继续进行如下设置&lt;br /&gt;第十一步：打开GridView的编辑列对话框。把EntityRef型字段（Nation1）添加到选中列中，再删除原有的Nation绑定列。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/c59640556429c3f2b645ae6b.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图21》&lt;br /&gt;第十二步：把Nation1转换为模板列。&lt;br /&gt;第十三步：修改模板列的绑定代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img style="width: 890px; height: 110px"  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/22884d08dd093706e8248874.jpg" width="890" height="110" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图22》&lt;br /&gt;运行页面，看到民族名称显示出来了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/b070db23d0ee8972ac34de75.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图23》&lt;br /&gt;至于Sex和Birthday字段的格式化显示，请参阅另外两篇文章：GridView详解 和 ListView详解&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;六、延迟加载与即时加载&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;延迟加载（Lazy Loading）：只有在我们需要数据的时候才去数据库读取加载它。&lt;br /&gt;&lt;/strong&gt;优点：较好的性能，有效节省内存资源。&lt;br /&gt;缺点：会产生多次与数据库之间的交互。&lt;br /&gt;&lt;strong&gt;即时加载（Eager Loading）：在加载数据时就把该对象相关联的其它表的数据一起加载到内存对象中去。&lt;br /&gt;&lt;/strong&gt;优点：能够一次性地把数据全加载到内存，不用反复与数据库之间进行交互操作&lt;br /&gt;缺点：占用服务器内存较多，在加载相关联数据的时候，会用到连接查询，会降低性能。&lt;br /&gt;&lt;strong&gt;在默认情况下，LinQ to SQL加载数据使用的是延迟加载。&lt;/strong&gt;比如：在我加载某个Info对象的时候，并不会立即加载该Info对象的Works、Families和Nation1三个成员对象，只有在我们访问到该对象的这三个成员的时候才会动态加载该Info对象相对应的三个对象的内容。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;与延迟加载密切相关的属性有两个：&lt;font color="#ff0000"&gt;DataContext&lt;/font&gt;.&lt;font color="#ff0000"&gt;DeferredLoadingEnabled&lt;/font&gt;和&lt;font color="#ff0000"&gt;DataContext.LoadOptions&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;DataContext.DeferredLoadingEnabled：是否采用延迟加载。&lt;/strong&gt;True-（默认值）采用延迟加载；False-不采用延迟加载&lt;strong&gt;（也不采用即时加载，加载的时候只加载当前对象的数据。当我们访问相关联子对象的时候也不会动态加载子对象的数据）&lt;br /&gt;DataContext.LoadOptions：加载选项，用来指定那些子对象采用即时加载方式。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先，我们来看看在默认情况下，即&amp;#8220;延迟加载&amp;#8221;的情况下，DataContext对象的结构：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/0099fb35b8c2aabda71e1272.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图24》&lt;br /&gt;从图24我们可以看出，在默认情况下，DataContext对象DeferredLoadingEnabled=true，即采用了延迟加载的方式。LoadOptions=null，即没有对任何子对象进行即时加载操作。&lt;br /&gt;下面我们再看看DataContext中Table&amp;lt;TEntity&amp;gt;的情况:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/415de5519ee79cb98d543073.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图25》&lt;br /&gt;从图25中我们可以看出，当我们访问Info对象的Works集合时，集合中会包含对应的数据，这些数据就是在访问该Works属性时动态从数据库中提取出来的。图中虽然有个IsDeffered=false，但这不代表该Works集合没有延迟加载，它代表Works集合是否正处于延迟状态，还未被执行查询。&lt;br /&gt;再从生成的SQL语句中来看&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/998a9e2a070e1cad023bf67c.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图26》&lt;br /&gt;我们看到生成的SQL语句仅仅是对Info表的数据进行查询。并没有查询Works表和Families表中的数据，这两个表中的数据是在后面被延迟加载的。&lt;/p&gt;&#xD;
&lt;p&gt;下面我们再看看&amp;#8220;非延迟加载&amp;#8221;的情况。&lt;br /&gt;需要大家注意的是：&amp;#8220;非延迟加载&amp;#8221;并不一定是&amp;#8220;即时加载&amp;#8221;，它两个不是一个概念。&lt;br /&gt;要实现&amp;#8220;非延迟加载&amp;#8221;需要把DataContext对象的DeferredLoadingEnabled属性设为False。&lt;br /&gt;然后我们再来看DataContext中的Table&amp;lt;TEntity&amp;gt;的情况：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/b6e1b81f9f324355f724e47d.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图27》&lt;br /&gt;从上图中我们看出在&amp;#8220;非延迟加载&amp;#8221;情况下，并不会自动加载子对象的数据。&lt;br /&gt;它所生成的语句与 图26是一样的。不一样的是，当我们访问Works集合时并没有动态加载相应的数据。&lt;/p&gt;&#xD;
&lt;p&gt;最后我们再来看看&amp;#8220;即时加载&amp;#8221;，&lt;strong&gt;&amp;#8220;即时加载&amp;#8221;与DataContext.DeferredLoadingEnabled的值没有太大的关系。它主要与DataContext.LoadOptions有关。&lt;br /&gt;&lt;/strong&gt;&amp;#8220;即时加载&amp;#8221;就是在加载Info对象的时候不只加载该对象的基本信息，它会把该对象的相关子对象(EntitySet和EntityRef)的数据一起加载出来，而不是等到用到的时候再加载。&lt;br /&gt;下面我们看看如何使用&amp;#8220;即时加载&amp;#8221;来加载Info对象。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/72bcd71696c68767f2de327e.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图28》&lt;br /&gt;从上图中我们可以看出，虽然DataContext.DeferredLoadingEnabled=false，但由于我使用了&amp;#8220;即时加载&amp;#8221;来加载了&amp;#8220;Nation1&amp;#8221;的数据，所以Nation1是有内容的。而Works和Families依然是Count=0&lt;br /&gt;下面我们再看看&amp;#8220;即时加载&amp;#8221;生成的SQL语句&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/41b80b3406371878241f147f.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;《图29》&lt;br /&gt;从图中我们看到这是一个左连接的SQL语句，在查询的时候，不再只查Info表的数据，而是把相应的Nation表的数据一起查出来了。这就是即时加载的原理。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意：对于一个DataContext对象，DataContext.LoadOptions属性只能赋一次值，一旦赋完值，我们将不能修改这个值了。因此，虽然DataLoadOptions提供了灵活的&amp;#8220;即时加载&amp;#8221;功能，但使用的时候一定要考虑清楚再使用。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;附：LinQ的查询管道&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;span&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/grayworm/pic/item/8a76652ee607b3664ec22679.jpg" small="0"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/2239625.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2011/11/07/2239625.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2011/06/04/2072540.html</id><title type="text">12个项目管理成功的关键原则</title><summary type="text">12个项目管理成功的关键原则1、项目经理必须关注项目成功的三个标准简单地说，一是准时;二是预算控制在既定的范围内;三是质量得到经理和用户们的赞许。项目经理必须保证项目小组的每一位成员都能对照上面三个标准来进行工作。2、任何事都应当先规划再执行就项目管理而言，很多专家和实践人员都同意这样一个观点：需要项目经理投入的最重要的一件事就是规划。只有详细而系统的由项目小组成员参与的规划才 是项目成功的唯一基础。当现实的世界出现了一种不适于计划生存的环境时，项目经理应制定一个新的计划来反映环境的变化。规划、规划、再规划就是项目经理的 一种生活方式。3、项目经理必须以自己的实际行动向项目小组成员传递一种紧迫</summary><published>2011-06-04T03:30:00Z</published><updated>2011-06-04T03:30:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2011/06/04/2072540.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2011/06/04/2072540.html"/><content type="html">&lt;h3 &gt;&lt;font size="5"&gt;&lt;font face="微软雅黑"&gt;&lt;span &gt;12个项目管理成功的关键原则&lt;/span&gt;&lt;span &gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p  style="line-height: 20px"&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、项目经理必须关注项目成功的三个标准&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;简单地说，一是准时;二是预算控制在既定的范围内;三是质量得到经理和用户们的赞许。项目经理必须保证项目小组的每一位成员都能对照上面三个标准来进行工作。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、任何事都应当先规划再执行&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;就项目管理而言，很多专家和实践人员都同意这样一个观点：需要项目经理投入的最重要的一件事就是规划。只有详细而系统的由项目小组成员参与的规划才 是项目成功的唯一基础。当现实的世界出现了一种不适于计划生存的环境时，项目经理应制定一个新的计划来反映环境的变化。规划、规划、再规划就是项目经理的 一种生活方式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、项目经理必须以自己的实际行动向项目小组成员传递一种紧迫感&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于项目在时间、资源和经费上都是有限的，项目最终必须完成。但项目小组成员大多有自己的爱好，项目经理应让项目小组成员始终关注项目的目标和截止期限。例如，可以定期检查，可以召开例会，可以制作一些提醒的标志置于项目的场所。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、成功的项目应使用一种可以度量且被证实的项目生命周期&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;标准的信息系统开发模型可以保证专业标准和成功的经验能够融入项目计划。这类模型不仅可以保证质量，还可以使重复劳动降到最低程度。因此，当遇到时间和预算压力需要削减项目时，项目经理应确定一种最佳的项目生命周期。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5、所有项目目标和项目活动必须生动形象地得以交流和沟通&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;项目经理和项目小组在项目开始时就应当形象化地描述项目的最终目标，以确保与项目有关的每一个人都能记住。项目成本的各个细节都应当清楚、明确、毫不含糊，并确保每个人对此都达成了一致的意见。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6、采用渐进的方式逐步实现目标&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果试图同时完成所有的项目目标，只会造成重复劳动，既浪费时间又浪费钱。俗话说，一口吃不成个胖子。项目目标只能一点一点地去实现，并且每实现一个目标就进行一次评估，确保整个项目能得以控制。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;7、项目应得到明确的许可，并由投资方签字实施&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在实现项目目标的过程中获得明确的许可是非常重要的。应将投资方的签字批准视为项目的一个出发点。道理很简单：任何有权拒绝或有权修改项目目标的人都应当在项目启动时审查和批准这些项目目标。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;8、要想获得项目成功必须对项目目标进行透彻的分析&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;研究表明，如果按照众所周知记录在案的业务需求来设计项目的目标，则该项目多半会成功。所以，项目经理应当坚持这样一个原则，即在组织机构启动项目之前，就应当为该项目在业务需求中找到充分的依据。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;9、项目经理应当责权对等&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;项目经理应当对项目的结果负责，这一点并不过分。但与此相对应，项目经理也应被授予足够的权利以承担相应的责任。在某些时候，权利显得特别重要，如获取或协调资源，要求得到有关的中小企业的配合，做相应的对项目成功有价值的决策等等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;10、项目投资方和用户应当主动介入，不能被动地坐享其成&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;多数项目投资方和用户都能正确地要求和行使批准(全部或部分)项目目标的权力。但伴随这个权力的是相应的责任&amp;#8212;&amp;#8212;主动地介入项目的各个阶段。例如， 在项目早期要帮助确定项目目标;在项目进行中，要对完成的阶段性目标进行评估，以确保项目能顺利进行。项目投资方应帮助项目经理去访问有关的中小企业和目 标顾客的成员，并帮助项目经理获得必要的文件资料。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;11、项目的实施应当采用市场运作机制&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在多数情况下，项目经理应将自己看成是卖主，以督促自己完成投资方和用户交付的任务。项目计划一旦批准项目经理应当定期提醒项目小组成员该项目必须满足的业务需求是什么，以及该怎样工作才能满足这些业务需求。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;12、项目经理应当获得项目小组成员的最佳人选&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最佳人选是指受过相应的技能培训，有经验，素质高。对于项目来说，获得最佳人选往往能弥补时间、经费或其它方面的不足。项目经理应当为这些最佳的项目成员创造良好的工作环境，如帮助他们免受外部干扰，帮助他们获得必要的工具和条件以发挥他们的才能。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/2072540.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2011/06/04/2072540.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/12/10/1901756.html</id><title type="text">领域驱动设计下系统层次结构风格</title><summary type="text">传统的三层架构最简单的分层方式自然就是“表现层、业务逻辑层和数据访问层”，我们可以用下图来表示这个思想：注意图中打虚线的“基础结构层”，从实践的表现上来看，这部分内容可能就是一些帮助类，比如 SQLHelper之类的，也可能是一些工具类，比如TextUtility之类。这些东西可以被其它各层所访问。而基于分层的概念，表现层只能跟业务逻辑层打交道，而业务逻辑层在数据持久化方面的操作，则依赖于数据访问层。表现层对数据访问层的内容一无所知。 从领域驱动的角度看，这种分层的方式有一定的弊端。首先，为各个层面提供服务的“基础结构层”的职责比较紊乱，它可以是纯粹的技术框架，也可以包含或处理一定的业务逻辑，</summary><published>2010-12-09T16:25:00Z</published><updated>2010-12-09T16:25:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/12/10/1901756.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/12/10/1901756.html"/><content type="html">&lt;p&gt;&lt;strong&gt;传统的三层架构&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;最简单的分层方式自然就是&amp;#8220;表现层、业务逻辑层和数据访问层&amp;#8221;，我们可以用下图来表示这个思想：&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/daxnet/WindowsLiveWriter/EntityFramework_7091/52017893333_2.gif"&gt;&lt;img height="137" alt="" src="http://images.cnblogs.com/cnblogs_com/hq2008/125514/r_1.gif" width="293" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意图中打虚线的&amp;#8220;基础结构层&amp;#8221;，从实践的表现上来看，这部分内容可能就是一些帮助类，比如 SQLHelper之类的，也可能是一些工具类，比如TextUtility之类。这些东西可以被其它各层所访问。而基于分层的概念，表现层只能跟业务逻辑层打交道，而业务逻辑层在数据持久化方面的操作，则依赖于数据访问层。表现层对数据访问层的内容一无所知。 &lt;/p&gt;&#xD;
&lt;p&gt;从领域驱动的角度看，这种分层的方式有一定的弊端。首先，为各个层面提供服务的&amp;#8220;基础结构层&amp;#8221;的职责比较紊乱，它可以是纯粹的技术框架，也可以包含或处理一定的业务逻辑，这样一来，业务逻辑层与&amp;#8220;基础结构层&amp;#8221;之间就会存在依赖关系；其次，这种结构过分地突出了&amp;#8220;数据访问&amp;#8221;的地位，把&amp;#8220;数据访问&amp;#8221;与 &amp;#8220;业务逻辑&amp;#8221;放在了等同的地位，这也难怪很多软件人员一上来就问：&amp;#8220;我的数据表该如何设计？&amp;#8221; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;img height="328" alt="" src="http://images.cnblogs.com/cnblogs_com/hq2008/125514/o_2.gif" width="426" border="0" /&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;领域驱动设计的分层&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;领域驱动设计将软件系统分为四层：基础结构层、领域层、应用层和表现层。与上述的三层相比，数据访问层已经不在了，它被移到基础结构层了。&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/daxnet/WindowsLiveWriter/EntityFramework_7091/52029421305_2.gif"&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;div align="left"&gt;基础结构层：该层专为其它各层提供技术框架支持。注意，这部分内容不会涉及任何业务知识。众所周知的数据访问的内容，也被放在了该层当中，因为数据的读写是业务无关的&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;div align="left"&gt;领域层：包含了业务所涉及的领域对象（实体、值对象）、领域服务以及它们之间的关系。这部分内容的具体表现形式就是领域模型（Domain Model）。领域驱动设计提倡富领域模型，即尽量将业务逻辑归属到领域对象上，实在无法归属的部分则以领域服务的形式进行定义。有关领域对象和领域服务的内容，&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;div align="left"&gt;应用层：该层不包含任何领域逻辑，但它会对任务进行协调，并可以维护应用程序的状态，因此，它更注重流程性的东西。在某些领域驱动设计的实践中，也会将其称为&amp;#8220;工作流层&amp;#8221;。应用层是领域驱动中最有争议的一个层次，也会有很多人对其职责感到模糊不清。比如，有些国外的开发人员会觉得，既然不包含领域逻辑，那又如何协调工作任务呢？&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;div align="left"&gt;表现层：这个好理解，跟三层里的表现层意思差不多，但请注意，&amp;#8220;Web服务&amp;#8221;虽然是服务，但它是表现层的东西(ExtJS框架+Asp.net MVC框架)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;从上图还可以看到，表现层与应用层之间是通过数据传输对象（DTO）进行交互的，数据传输对象是没有行为的POCO对象，它的目的只是为了对领域对象进行数据封装，实现层与层之间的数据传递。为何不能直接将领域对象用于数据传递？因为领域对象更注重领域，而DTO更注重数据。不仅如此，由于&amp;#8220;富领域模型&amp;#8221;的特点，这样做会直接将领域对象的行为暴露给表现层&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;系统结构&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于是领域驱动设计，本案例系统分层与传统分层略有不同。分为四层：展现层、应用服务层、领域层和基础结构层。展现层采用ASP.NET MVC框架实现；应用服务层则是一个WCF Service；领域层采用Entity Framework结合领域接口；基础结构层则为整个应用提供了IoC、Caching、Specifications、Repository等的具体实现。整个系统架构基本上可以以下图描述：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/daxnet/Windows-Live-Writer/TinyLibrary_12636/image_2.png"&gt;&#xD;
&lt;div align="center"&gt;&lt;img height="324" alt="" src="http://images.cnblogs.com/cnblogs_com/hq2008/125514/r_3.png" width="638" border="0" /&gt;&lt;/div&gt;&lt;/a&gt;&amp;nbsp;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;需要说明的是，在上图中的Domain Model和EdmRepository之间出现了双向依赖。其实，Domain Model只依赖于仓储（Repository）的接口，而EdmRepository是基于Entity Framework的一种仓储实现方式，它实现IRepository接口，同时也对Domain Model产生依赖，以获得对聚合根的访问。关键的一步在于，EnterpriseLibrary Library采用依赖注入，将EdmRepository注射到Domain Model中，于是，Domain Model根本不依赖于仓储的具体实现方式，保证了领域模型层面的纯净度。&lt;/p&gt;&#xD;
&lt;p&gt;仓储的实现可以用下图表述： &lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/daxnet/WindowsLiveWriter/EntityFramework_B1D1/191014782220_2.gif"&gt;&lt;img height="299" alt="" src="http://images.cnblogs.com/cnblogs_com/hq2008/125514/o_4.gif" width="445" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从本文还可以了解到，&lt;strong&gt;依赖注入是维持领域模型纯净度的一大利器；另一大利器是领域事件&lt;/strong&gt;，我将在后续的文章中详述。对于本文开始的第三个问题，也就是仓储实现的可扩展性，将在下篇文章中进行讨论，包括的内容有：事务处理和可扩展的仓储框架的实现。 &lt;/p&gt;&#xD;
&lt;p&gt;在面向对象的程序中，用户界面(UI)、数据库和其他支持代码，经常被直接写到业务对象中去。在UI和数据库脚本的行为中嵌入额外的业务逻辑。出现这种情况是因为层短期的观点看，它是使系统运行起来的最容易的方式。 &lt;/p&gt;&#xD;
&lt;p&gt;当与领域相关的代码和大量的其他代码混在一起时，就很难阅读并理解了。对UI的简单改动就会改变业务逻辑。改变业务规则可能需要小心翼翼地跟踪UI 代码、数据库代码或者其他的程序元素。实现一致的模型驱动对象变都不切实际，而且自动化测试也难已使用.如果在程序的每一个行为中包括了所有的技术和逻辑，那么它必须很简单，否则会难以理解。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img height="450" alt="" src="http://images.cnblogs.com/cnblogs_com/hq2008/125514/5.jpg" width="465" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="1"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="width: 20%"&gt;用户界面层 &lt;/td&gt;&#xD;
&lt;td&gt;负责向用户显示信息，并且解析用户命令。外部的执行者有时可能会是其他的计算机系统，不一定非是人 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;应用层 &lt;/td&gt;&#xD;
&lt;td&gt;定义软件可以完成的工作，并且指挥具有丰富含义的领域对象来解决问题。这个层附负责的任务对业务影响深远，对跟其他系统的应用层进行交互非常必要。这个层要保存简练。它不包括处理业务规则或知识。只是给下一层中相互协作的领域对象协调任务、委托工作。在这个层次中不反映业务情况的状态，但反映用户或程序的任务进度的状态&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;领域层 &lt;/td&gt;&#xD;
&lt;td&gt;负责表示业务概念、业务状况的信息以及业务规则。尽管保存这些内容的技术细节由基础结构层兰完成。反映业务在的状态在该层中被控制和使用。这一层是业务软件的核心&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;基础结构层 &lt;/td&gt;&#xD;
&lt;td&gt;为上册提供通用的技术能力；应用的消息发送、领域持久化，为用户加盟绘制窗口等。提供架构框架，基本结构层还可以支持这四层之间的交互模式&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在一个复杂的程序进行层次划分。为每一层进行设计，每层都是内聚的而且只依赖于它的下层。采的用标准的架构模式来完成与上层松散关联。将所有与领域模型相关的代码集中在一层，并且家它与用户界面层、应用层和基础结构层的代码分离。领域对象可以将重点放在表达领域模型上，不需要关心他们自己的显示、存储和管理应用任务等内容。这样使模型发展得足够丰富和清晰，足以抓住本质的业务知识并实现它。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1901756.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/12/10/1901756.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/08/26/1809136.html</id><title type="text">项目管理过程之项目团队</title><summary type="text">项目管理过程之项目团队对于以项目为基本运作单位的公司来说，&amp;#8220;项目组&amp;#8221;具有相当的独立性，是典型意义上的团队。团队有两个鲜明的特点：第一是个体成员有共同的工作目标；第二是成员需要协同工作，也就是说某个成员工作需要依赖于另一成员的结果。举个简单的例子，如果用照相机拍完一张照片，你无法说清拍这张照片是镜头的功劳，还是暗箱、快门、胶卷的功劳，其实，这些部件的工作能力必须通过一个整体表...</summary><published>2010-08-26T07:22:00Z</published><updated>2010-08-26T07:22:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/08/26/1809136.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/08/26/1809136.html"/><content type="html">&lt;span style="font-size: 12pt; color: black; font-family: 宋体"&gt;&lt;strong&gt;项目管理过程之项目团队&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; color: black; font-family: 宋体"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 宋体"&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 宋体"&gt;对于以项目为基本运作单位的公司来说，&amp;#8220;项目组&amp;#8221;具有相当的独立性，是典型意义上的团队。团队有两个鲜明的特点：第一是个体成员有共同的工作目标；第二是成员需要协同工作，也就是说某个成员工作需要依赖于另一成员的结果。举个简单的例子，如果用照相机拍完一张照片，你无法说清拍这张照片是镜头的功劳，还是暗箱、快门、胶卷的功劳，其实，这些部件的工作能力必须通过一个整体表现出来，这个整体就像是团队。另外需要注意的是，这种协同工作产生的整体效力无法通过数量的叠加形成。&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在IT项目中，团队建设的意义重大。虽然一个企业可以通过各种方式获得各种优秀人才，但能否让他们协同工作就难说了。正所谓&amp;#8220;获得优秀的球员容易，但让他们一起打球就很难了（Casey Stengel）&amp;#8221;。在失败的项目中，团队分裂因素占相当的比例。 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;团队工作的方式有明显的特点，就像驾船向目标远航的过程：首先，帆船每次出航都有明确的目的；其次，一艘船只能装载一定的资源，续航能力有限，必须在限定的约束内完成目标；第三，一艘船上的船员分工明确、专人专岗，岗位难以相互替换；第四，在大海中航行的帆船要独立应对各种情况，独立分析判断并做出决策；第五，如果能到达目的地，是所有船员的功劳，而一旦航行失败，没有一个船员会单独获得荣誉。 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;成功团队会具有一些共同的特点：首先是团队的目标明确，成员清楚自己工作对目标的贡献；第二，团队的组织结构清晰，岗位明确；第三，有成文或习惯的工作流程和方法，而且流程简明有效；第四，项目经理对团队成员有明确的考核和评价标准，工作结果公正公开、赏罚分明；第五，组织纪律性，这点往往容易被忽略。违反纪律往往会牺牲多数人的利益，因此&amp;#8220;以人为本&amp;#8221;绝不是&amp;#8220;以个人为本&amp;#8221;；第六，相互信任，善于总结和学习。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;优秀团队的建设并非一蹴而就，要经历几个阶段。第一个阶段称为形成期（Forming），团队中的个体成员转变为团队成员，开始形成共同目标；团队往往会沉浸在对未来的美好期待中。第二个阶段称为震荡期（Storming），团队成员开始执行分配的任务，一般会遇到超出预想的困难，希望被现实打破，个体之间开始争执，互相指责，并且开始怀疑项目经理的能力。第三个阶段称为正规期（Norming），经过一定时间的磨合，团队成员之间相互熟悉和了解，矛盾基本解决，项目经理能够确立正确的关系。第四个阶段称为表现期（Performing），随着相互之间的配合默契和对项目经理信任，成员积极工作，努力实现目标。这时集体荣誉感非常强，常将团队换成第一称谓，如&amp;#8220;我们那个组&amp;#8221;&amp;#8220;我们部门&amp;#8221;等，并会努力捍卫团队声誉。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在建设团队的各个阶段中，一些必要的团队建设方法非常重要。这里介绍一些实用方法：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;挑选骨干&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#8220;一个好汉三个帮&amp;#8221;，如果没有几个核心骨干，一个项目经理难以管理众多人员。骨干成员与基本成员的重要区别是：基本成员要求合理物质回报和良好文化氛围，而骨干成员往往认识到机会的重要性，认为成功比金钱重要。 &lt;br /&gt;&lt;br /&gt;沟通渠道&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;一个团队不仅需要工作上的沟通，还需要一些&amp;#8220;生活&amp;#8221;上的沟通，这可以帮助大家建立信任和友情，在工作中能起促进作用。可以采用的方法包括每天与不同的人吃工作午餐；还可以在周末组织大家一起吃晚餐，逐步建立开诚布公的良好文化氛围。 &lt;br /&gt;&lt;br /&gt;地理集中&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;中的环境下一起工作对团队建设的作用决不可忽视。大家可以经常交流工作和个人情况，避免&amp;#8220;我们&amp;#8221;对&amp;#8220;他们&amp;#8221;以及团队的分裂成小团体的情况发生。&lt;br /&gt;&lt;br /&gt;注意心理疲劳&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;的工作强度一般都比较大，为了进度往往连续加班，在这种情况下，更要注意工作的阶段性和节奏性。可以在取得阶段性目标的情况下举行庆祝活动，并让每个人参加，让大家适度放松并建立信心。&lt;br /&gt;&lt;br /&gt;团队会议&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;不同于工作会议，一种是讨论团队工作中存在哪些问题以及如何改进，项目经理不是下结论的人，而是寻求答案的人。另一种是帮助某个成员进行改进。第二种会议可以先让被讨论的对象回避，自己写评语，同时大家写对他的评语。然后对比双方的差异，找出问题所在以求不断改进。&lt;br /&gt;&lt;br /&gt;评价成员&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;成员在完成委派的任务后都非常期待着评价。评价可以是正向的也可以是负面的。一般都可以表扬、提醒、批评和处罚。表扬和批评最好公开公正，否则达不到鼓励先进、鞭策后进的作用。对工作中出现的过失、或因事先没有约定造成的问题，应该考虑先提醒。提醒要隐蔽，让成员知道错误和后果，并承诺不再犯错。处罚是万不得以的措施，处罚不是惩罚：惩罚是报复性措施，有感情色彩和 &amp;#8220;摆平&amp;#8221;的意思，而处罚是中性处理措施，不涉及人身攻击，且被处罚的人事先知道这是自己行为的结果。 &lt;br /&gt;&lt;br /&gt;解决冲突&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 好的团队是&amp;#8220;打出来的，不是练出来的！&amp;#8221; ，在巨大的工作压力下冲突在所难免。冲突的益处是暴露问题，激起讨论，澄清思想或寻求新的方案；害处是控制不好就会破坏沟通、破坏团结、降低信任。正确解决冲突首先要营造氛围，控制情绪，建立友善信任的环境；其次要正视问题，换位思考，愿意倾听别人的意见；第三，要积极沟通，交换意见，寻找分歧；第四，要肯放弃原来观点并重新考虑问题；第五，力争达成一致，尽力得到最好和最全面的方案。&lt;br /&gt;总之，团队建设非常重要。但这不仅仅是一个团队的事，还与企业文化密切相关，而企业文化则需要一定时间进行积累和沉淀。&lt;/span&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1809136.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/08/26/1809136.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/07/25/1784866.html</id><title type="text">德鲁克之沟通的四原则</title><summary type="text">第一个就抓到了沟通是一种感知，什么叫感知呢？意思是按照对方的经验或能接纳的语言表达。 譬如说是一个小孩子，你一定要用小孩子的方式跟他沟通，你不能说你是大人用大人的方式，他是小孩无法沟通。假设他是一个木匠，要跟他沟通一定要懂得木匠的语言跟他沟通，刚才讲他的身份是校长，校长是学校里面微笑的长辈，意思是说他是一个校长，这个校长本身你必须要懂得他的语言，这个是感知，感知是根据他的感觉，根据他的经验来表达，...</summary><published>2010-07-25T13:55:00Z</published><updated>2010-07-25T13:55:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/07/25/1784866.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/07/25/1784866.html"/><content type="html">&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-weight: bold; font-size: 14pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-weight: bold; font-size: 14pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;第一个就抓到了沟通是一种感知，什么叫感知呢？&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;意思是按照对方的经验或能接纳的语言表达&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 譬如说是一个小孩子，你一定要用小孩子&amp;nbsp;的方式跟他沟通，你不能说你是大人用大人的方式，他是小孩无法沟通。假设他是一个木匠，要跟他沟通一定要懂得木匠的语言跟他沟通，刚才讲他的身份是校长，&amp;nbsp;校长是学校里面微笑的长辈，意思是说他是一个校长，这个校长本身你必须要懂得他的语言，这个是感知，感知是根据他的感觉，根据他的经验来表达，来传送你的&amp;nbsp;信息。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 14pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;第二个把握的原则就是，要根据对方的期望&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 而不是想要表达我要卖什么，我要讲什么，不是，而是对方的价值观是什么？他期待什么？他需求什么？他不要什么？&amp;nbsp;他讨厌什么？这个时候我们越来越清楚，原来我们要提供的是他能够接纳的，他想要的，这个时候期望可以得到满足。&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 14pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;第三个原则是，必须在沟通里面造成要求，提出要求。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-weight: bold; font-size: 14pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-weight: bold; font-size: 14pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;意思是我沟通我要传达信息给你，我是一个老总，我要把我的意念、我的想法告诉你，你去完成任务。这个时&amp;nbsp;候你也必须用他的语言，用属下能够听得懂的语言，不打官腔，清楚的把所有该讲的话，透过你的描述，透过他的价值观，期望能够和公司的价值观吻合，能够跟所&amp;nbsp;达成的目的吻合，这样皆大欢喜，他要达成目的公司也很棒，他也很愿意，这样双赢。&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 14pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;第四个沟通和资讯往往是对立，但往往是关联的。&lt;/span&gt;&lt;span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;因为沟通是一种经验，而资讯刚好是一种逻辑&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 逻辑是有编码的，但是接收者必须要解码。比如我发一个简讯给&amp;nbsp;你，他说没收到或收到之后没讲清楚，这叫解码。任何东西都要解码，教科书里面我们要解码，没有解码我们不明白什么意思，所以才要老师带。&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&amp;nbsp;这个时候我们必须要晓得，所有沟通最棒的沟通第一个叫经验沟通，经验分享。第二个沟通叫做所谓的现身说法&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"&gt;。&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;优米网&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"&gt;就&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;刚好提供了一个这样的平台，它既有感知、期望，然后还有一个能够达到年轻人一同成长这样的欲望、这样的要求。那么另外它还透过所谓的网络，然后让大家能够看得到，时间还可以停留，然后你可以&amp;nbsp;来，不会像看电视，看完了我因为没有把它录下来，它这个可以时时刻刻重复再重复。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 0pt; margin-bottom: 0pt"&gt;&lt;span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1784866.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/07/25/1784866.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/06/29/1767530.html</id><title type="text">Entity Framework级联更新</title><summary type="text">首先來看一下 示範資料庫的 ER-ModelUser 使用者 Group 群組 UserDepartment 使用者部門需求是要建立一個 User 包含 UserDepartment 以及 Group， 直接來看語法方式一view sourceprint?01using (TestEntities te = new TestEntities())02{ 03////新增一個 User04User ...</summary><published>2010-06-29T05:55:00Z</published><updated>2010-06-29T05:55:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/06/29/1767530.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/06/29/1767530.html"/><content type="html">&lt;p&gt;首先來看一下 示範資料庫的 ER-Model&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" rel="lightbox" href="http://files.dotblogs.com.tw/asdtey/0910/ADO.NetEntityFramework_AA80/2009-10-12_122043_2.jpg"&gt;&lt;img style="border: 0px none ; display: inline;" title="2009-10-12_122043" alt="2009-10-12_122043" src="http://files.dotblogs.com.tw/asdtey/0910/ADO.NetEntityFramework_AA80/2009-10-12_122043_thumb.jpg" border="0" height="362" width="484" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;User 使用者 &lt;br /&gt;Group 群組 &lt;br /&gt;UserDepartment 使用者部門&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;需求是要建立一個 User 包含 UserDepartment 以及 Group， &lt;br /&gt;直接來看語法&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;方式一&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div csharp="" id="highlighter_886460"&gt;&lt;div&gt;&lt;div&gt;&lt;a target="_blank" viewsource="" style="width: 16px; height: 16px;" title="view source" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/12/11019.aspx#viewSource"&gt;view source&lt;/a&gt;&lt;div copytoclipboard=""&gt;&lt;embed id="highlighter_886460_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_886460" menu="false" src="http://www.dotblogs.com.tw/SyntaxHighlighter2/Scripts/clipboard.swf" height="16" width="16"&gt;&lt;/div&gt;&lt;a target="_blank" printsource="" style="width: 16px; height: 16px;" title="print" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/12/11019.aspx#printSource"&gt;print&lt;/a&gt;&lt;a target="_blank" about="" style="width: 16px; height: 16px;" title="?" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/12/11019.aspx#about"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code keyword=""&gt;using&lt;/code&gt; &lt;code plain=""&gt;(TestEntities te = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;TestEntities())&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////新增一個 User&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User u = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;User()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User_name = &lt;/code&gt;&lt;code string=""&gt;"David"&lt;/code&gt;&lt;code plain=""&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User_email = &lt;/code&gt;&lt;code string=""&gt;"asdtey@yahoo.com.tw"&lt;/code&gt;&lt;code plain=""&gt;,&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////此為多對一時的新增方式&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;UserDepartment = te.UserDepartment.Where(a =&amp;gt; a.UserDepartment_name == &lt;/code&gt;&lt;code string=""&gt;"開發部"&lt;/code&gt;&lt;code plain=""&gt;).First() &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;};&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////新增User屬於的群組&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////先取得要新增的群組&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;Group g1 = te.Group.Where(a =&amp;gt; a.Group_name == &lt;/code&gt;&lt;code string=""&gt;"攝影社"&lt;/code&gt;&lt;code plain=""&gt;).First();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;Group g2 = te.Group.Where(a =&amp;gt; a.Group_name == &lt;/code&gt;&lt;code string=""&gt;"開發二"&lt;/code&gt;&lt;code plain=""&gt;).First();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////多對多的新增方式&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Add(g1); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Add(g2);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.AddToUser(u);&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////儲存&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;此方法可以順利新增一個 User 同時包含 UserDepartment 以及 Group， &lt;br /&gt;不過有個問題是說仔細去看語法時， &lt;br /&gt;會發現在新增之前會先去資料庫取得UserDepartment 以及 Group 的資料，才進行新增， &lt;br /&gt;但我只是要新增 User ，並沒有要取得 UserDepartment 、 Group 的資料， &lt;br /&gt;每次新增都先去資料庫撈資料，會影響效能， &lt;br /&gt;這邊分享另一種寫法&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;方法二&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div csharp="" id="highlighter_770283"&gt;&lt;div&gt;&lt;div&gt;&lt;a target="_blank" viewsource="" style="width: 16px; height: 16px;" title="view source" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/12/11019.aspx#viewSource"&gt;view source&lt;/a&gt;&lt;div copytoclipboard=""&gt;&lt;embed id="highlighter_770283_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_770283" menu="false" src="http://www.dotblogs.com.tw/SyntaxHighlighter2/Scripts/clipboard.swf" height="16" width="16"&gt;&lt;/div&gt;&lt;a target="_blank" printsource="" style="width: 16px; height: 16px;" title="print" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/12/11019.aspx#printSource"&gt;print&lt;/a&gt;&lt;a target="_blank" about="" style="width: 16px; height: 16px;" title="?" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/12/11019.aspx#about"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code color1=""&gt;////方式二&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code keyword=""&gt;using&lt;/code&gt; &lt;code plain=""&gt;(TestEntities te = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;TestEntities())&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////新增一個 User&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User u = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;User()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User_name = &lt;/code&gt;&lt;code string=""&gt;"David"&lt;/code&gt;&lt;code plain=""&gt;,&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User_email = &lt;/code&gt;&lt;code string=""&gt;"asdtey@yahoo.com.tw"&lt;/code&gt;&lt;code plain=""&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;};&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////此為多對一時的新增方式&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;UserDepartment userDepartment = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;UserDepartment()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;EntityKey = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;EntityKey(&lt;/code&gt;&lt;code string=""&gt;"TestEntities.UserDepartment"&lt;/code&gt;&lt;code plain=""&gt;, &lt;/code&gt;&lt;code string=""&gt;"UserDepartment_id"&lt;/code&gt;&lt;code plain=""&gt;, 1),&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;UserDepartment_id = 1&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;};&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.Attach(userDepartment);&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.UserDepartment = userDepartment;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;//////多對多的新增方式&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;Group g1 = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;Group()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;EntityKey = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;EntityKey(&lt;/code&gt;&lt;code string=""&gt;"TestEntities.Group"&lt;/code&gt;&lt;code plain=""&gt;, &lt;/code&gt;&lt;code string=""&gt;"Group_id"&lt;/code&gt;&lt;code plain=""&gt;, 1),&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;Group_id = 1&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;};&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.Attach(g1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;27&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Add(g1);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;28&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;29&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;Group g2 = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;Group()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;31&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;EntityKey = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;EntityKey(&lt;/code&gt;&lt;code string=""&gt;"TestEntities.Group"&lt;/code&gt;&lt;code plain=""&gt;, &lt;/code&gt;&lt;code string=""&gt;"Group_id"&lt;/code&gt;&lt;code plain=""&gt;, 2),&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;32&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;Group_id = 2&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;33&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;};&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;34&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.Attach(g2);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;35&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Add(g2);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;36&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;37&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////儲存&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;38&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.AddToUser(u);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;39&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;40&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;此方法利用EntityKey讓ObjectContext知道我們要關聯的物件是甚麼， &lt;br /&gt;就不會先去資料庫撈資料，提升效能， &lt;br /&gt;但是缺點是要打的code變多了，也缺少IntelliSence &lt;br /&gt;&lt;br /&gt;再分享一下，如果只要新增User以及UserDepartment(多對一關係)時， &lt;br /&gt;還可以這樣寫，&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;方法三&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div csharp="" id="highlighter_510505"&gt;&lt;div&gt;&lt;div&gt;&lt;a target="_blank" viewsource="" style="width: 16px; height: 16px;" title="view source" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/12/11019.aspx#viewSource"&gt;&lt;/a&gt;&lt;div copytoclipboard=""&gt;&lt;embed id="highlighter_510505_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_510505" menu="false" src="http://www.dotblogs.com.tw/SyntaxHighlighter2/Scripts/clipboard.swf" height="16" width="16"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code color1=""&gt;////方式三&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code keyword=""&gt;using&lt;/code&gt; &lt;code plain=""&gt;(TestEntities te = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;TestEntities())&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////新增一個 User&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User u = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;User()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User_name = &lt;/code&gt;&lt;code string=""&gt;"David"&lt;/code&gt;&lt;code plain=""&gt;,&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;User_email = &lt;/code&gt;&lt;code string=""&gt;"asdtey@yahoo.com.tw"&lt;/code&gt;&lt;code plain=""&gt;,&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;};&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.UserDepartmentReference.EntityKey = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;EntityKey(&lt;/code&gt;&lt;code string=""&gt;"TestEntities.UserDepartment"&lt;/code&gt;&lt;code plain=""&gt;, &lt;/code&gt;&lt;code string=""&gt;"UserDepartment_id"&lt;/code&gt;&lt;code plain=""&gt;, 1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////儲存&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.AddToUser(u);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;建議在大量新增的時候 可以使用方法二 避免影響效能及資料庫&lt;/p&gt;&lt;p&gt;&lt;p&gt;一樣先來看一下 示範資料庫的 ER-Model&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://files.dotblogs.com.tw/asdtey/0910/ADO.NetEntityFramework_AA80/2009-10-12_122043_2.jpg"&gt;&lt;img title="2009-10-12_122043" alt="2009-10-12_122043" src="http://files.dotblogs.com.tw/asdtey/0910/ADO.NetEntityFramework_AA80/2009-10-12_122043_thumb.jpg" border="0" height="362" width="484" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;User 使用者 &lt;br /&gt;Group 群組 &lt;br /&gt;UserDepartment 使用者部門&lt;/p&gt;&lt;p&gt;&lt;br /&gt;需求是要修改 User的資料&amp;nbsp; 包含 UserDepartment 以及 Group， &lt;br /&gt;直接來看語法&lt;/p&gt;&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f95085e1-cb1f-4980-96a4-4a68ed4f3fa4"&gt;&lt;div csharp="" id="highlighter_228732"&gt;&lt;div&gt;&lt;div&gt;&lt;a target="_blank" viewsource="" style="width: 16px; height: 16px;" title="view source" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/13/11031.aspx#viewSource"&gt;view source&lt;/a&gt;&lt;div copytoclipboard=""&gt;&lt;embed id="highlighter_228732_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_228732" menu="false" src="http://www.dotblogs.com.tw/SyntaxHighlighter2/Scripts/clipboard.swf" height="16" width="16"&gt;&lt;/div&gt;&lt;a target="_blank" printsource="" style="width: 16px; height: 16px;" title="print" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/13/11031.aspx#printSource"&gt;print&lt;/a&gt;&lt;a target="_blank" about="" style="width: 16px; height: 16px;" title="?" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/13/11031.aspx#about"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code keyword=""&gt;using&lt;/code&gt; &lt;code plain=""&gt;(TestEntities te = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;TestEntities())&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////取得 David 資料&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;var u = te.User.Where(a =&amp;gt; a.User_name == &lt;/code&gt;&lt;code string=""&gt;"David"&lt;/code&gt;&lt;code plain=""&gt;).First();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Load();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.UserDepartmentReference.Load();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////修改 Email&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.User_email = &lt;/code&gt;&lt;code string=""&gt;"asdtey@yahoo.com.tw"&lt;/code&gt;&lt;code plain=""&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code comments=""&gt;//修改使用者部門&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////先取得要變更成的部門&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;var t = te.UserDepartment.Where(a =&amp;gt; a.UserDepartment_name == &lt;/code&gt;&lt;code string=""&gt;"經理部"&lt;/code&gt;&lt;code plain=""&gt;).First();&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////重新給予部門&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.UserDepartment = t;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code comments=""&gt;//修改群組&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////因為 User 與 Group 為多對多的關係&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////因此修改方式為 刪除與新增&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;27&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////刪除群組&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;28&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;var g = u.Group.First();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;29&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Remove(g);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;31&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////取得要新增的群組&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;32&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;var g1 = te.Group.Where(a =&amp;gt; a.Group_name == &lt;/code&gt;&lt;code string=""&gt;"電研社"&lt;/code&gt;&lt;code plain=""&gt;).First();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;33&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Add(g1);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;34&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;35&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges(); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;36&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;修改部分比較簡單，下次來介紹刪除的部分&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;一樣先來看 ER-Model&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" rel="lightbox" href="http://files.dotblogs.com.tw/asdtey/0910/ADO.NetEntityFramework_B839/2009-10-12_122043_2.jpg"&gt;&lt;img style="border: 0px none ; display: inline;" title="2009-10-12_122043" alt="2009-10-12_122043" src="http://files.dotblogs.com.tw/asdtey/0910/ADO.NetEntityFramework_B839/2009-10-12_122043_thumb.jpg" border="0" height="482" width="644" /&gt;&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;需求是要刪除使用者(User)資料， &lt;br /&gt;來看看範例&lt;/p&gt;&lt;p&gt;&lt;strong&gt;範例一&lt;/strong&gt;&lt;/p&gt;&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3dcddd6a-38fe-4519-a8a8-242c7611d4c2"&gt;&lt;div csharp="" id="highlighter_803943"&gt;&lt;div&gt;&lt;div&gt;&lt;a target="_blank" viewsource="" style="width: 16px; height: 16px;" title="view source" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/19/11112.aspx#viewSource"&gt;view source&lt;/a&gt;&lt;div copytoclipboard=""&gt;&lt;embed id="highlighter_803943_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_803943" menu="false" src="http://www.dotblogs.com.tw/SyntaxHighlighter2/Scripts/clipboard.swf" height="16" width="16"&gt;&lt;/div&gt;&lt;a target="_blank" printsource="" style="width: 16px; height: 16px;" title="print" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/19/11112.aspx#printSource"&gt;print&lt;/a&gt;&lt;a target="_blank" about="" style="width: 16px; height: 16px;" title="?" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/19/11112.aspx#about"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code color1=""&gt;////範例&amp;nbsp;&amp;nbsp; 刪除 David 的資料&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code keyword=""&gt;using&lt;/code&gt; &lt;code plain=""&gt;(TestEntities te = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;TestEntities())&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////先取得 David 的資料&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;var u = te.User.Where(a =&amp;gt; a.User_name == &lt;/code&gt;&lt;code string=""&gt;"David"&lt;/code&gt;&lt;code plain=""&gt;).First();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////刪除 David&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.DeleteObject(u);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////儲存變更&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;這段語法看起來正常，但是一執行卻發生 &lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;'/ADOEntityFrameworkDemo' 應用程式中發生伺服器錯誤。 &lt;hr size="1" width="100%" /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;The DELETE statement conflicted with the REFERENCE constraint "FK_UserGroup_User". The conflict occurred in database "Test", table "dbo.UserGroup", column 'UserGroup_userid'. &lt;br /&gt;The statement has been terminated.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;描述: &lt;/strong&gt;在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊，以及在程式碼中產生的位置。 &lt;br /&gt;&lt;strong&gt;例外詳細資訊: &lt;/strong&gt;System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_UserGroup_User". The conflict occurred in database "Test", table "dbo.UserGroup", column 'UserGroup_userid'. &lt;br /&gt;The statement has been terminated.&lt;/p&gt;&lt;p&gt;@@&amp;nbsp; 原來是因為還有 Reference ， &lt;br /&gt;再把語法修改一下&lt;/p&gt;&lt;p&gt;&lt;strong&gt;範例二&lt;/strong&gt;&lt;/p&gt;&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:00d09717-fa6e-4d39-aef3-75d3d90dfaf9"&gt;&lt;div csharp="" id="highlighter_375449"&gt;&lt;div&gt;&lt;div&gt;&lt;a target="_blank" viewsource="" style="width: 16px; height: 16px;" title="view source" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/19/11112.aspx#viewSource"&gt;view source&lt;/a&gt;&lt;div copytoclipboard=""&gt;&lt;embed id="highlighter_375449_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_375449" menu="false" src="http://www.dotblogs.com.tw/SyntaxHighlighter2/Scripts/clipboard.swf" height="16" width="16"&gt;&lt;/div&gt;&lt;a target="_blank" printsource="" style="width: 16px; height: 16px;" title="print" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/19/11112.aspx#printSource"&gt;print&lt;/a&gt;&lt;a target="_blank" about="" style="width: 16px; height: 16px;" title="?" href="http://www.dotblogs.com.tw/asdtey/archive/2009/10/19/11112.aspx#about"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code color1=""&gt;////範例&amp;nbsp;&amp;nbsp; 刪除 David 的資料&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code keyword=""&gt;using&lt;/code&gt; &lt;code plain=""&gt;(TestEntities te = &lt;/code&gt;&lt;code keyword=""&gt;new&lt;/code&gt; &lt;code plain=""&gt;TestEntities())&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;{&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////先取得 David 的資料&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;var u = te.User.Where(a =&amp;gt; a.User_name == &lt;/code&gt;&lt;code string=""&gt;"David"&lt;/code&gt;&lt;code plain=""&gt;).First();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////ADO.Net Framework 在刪除的時候，會連帶一起刪除關連的資料&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////但是必須先載入關連的資料&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.Group.Load();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;u.UserDepartmentReference.Load();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////刪除 David&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.DeleteObject(u);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code color1=""&gt;////儲存變更&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt2=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code plain=""&gt;te.SaveChanges();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div alt1=""&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code plain=""&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;這段語法就可以順利執行囉&lt;/p&gt;&lt;p&gt;說明一下，ADO.Net Entity Framework 在處理關聯式資料的時候，會把相關的所有資料一起刪除， &lt;br /&gt;但是前提是在刪除前，必須先使用【Load】方法，把相關聯資料載入&lt;/p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1767530.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/06/29/1767530.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/05/28/1746515.html</id><title type="text">OOAD &amp;amp; OOP</title><summary type="text">一、面向对象技术基本概念 面向对象技术基于对象概念，以对象为中心，以类和继承为构造机制，充分利用接口和多态提供灵活性，来认识、理解、刻划客观世界和设计、构建相应的软件系统.面向对象的特征&amp;#8211; 抽象，先不考虑细节&amp;#8211; 封装，隐藏内部实现&amp;#8211; 继承，复用现有代码&amp;#8211; 多态，改写对象行为二、面向对象的设计目标1、可扩展性Extensibility&amp;#8211;容易...</summary><published>2010-05-28T09:31:00Z</published><updated>2010-05-28T09:31:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/05/28/1746515.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/05/28/1746515.html"/><content type="html">&lt;p&gt;&lt;strong&gt;一、面向对象技术基本概念&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 面向对象技术基于对象概念，以对象为中心，以类和继承为构造机制，充分利用接口和多态提供灵活性，来认识、理解、刻划客观世界和设计、构建相应的软件系统.&lt;/p&gt;&#xD;
&lt;p&gt;面向对象的特征&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8211; 抽象，先不考虑细节&lt;br /&gt;&amp;#8211; 封装，隐藏内部实现&lt;br /&gt;&amp;#8211; 继承，复用现有代码&lt;br /&gt;&amp;#8211; 多态，改写对象行为&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、面向对象的设计目标&lt;br /&gt;&lt;/strong&gt;1、可扩展性Extensibility&lt;br /&gt;&amp;#8211;容易添加新的功能&lt;br /&gt;2、灵活性Flexibility&lt;br /&gt;&amp;#8211;容易添加新的功能代码修改平稳地发生&lt;br /&gt;3、可插入性Pluggability&lt;br /&gt;&amp;#8211;容易将一个类抽出去，同时将另一个有同样接口的类加入进来&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;三、面向对象设计基本的设计原则: &lt;br /&gt;&lt;/strong&gt;1、针对接口编程，而不是针对实现编程&lt;br /&gt;&amp;#8211; 客户无需知道所使用对象的特定类型，只需要知道对象拥有客户所期望的接口。&lt;br /&gt;2、优先使用对象组合，而不是类继承&lt;br /&gt;&amp;#8211; 继承在某种程度上破坏了封装性，子类父类耦合度高；而对象组合则只要求被组合的对象具有良好定义的接口，耦合度低。&lt;br /&gt;3、封装变化点&lt;br /&gt;&amp;#8211; 使用封装来创建对象之间的分界层，让设计者可以在分界层的一侧进行修改，而不会对另一侧产生不良的影响，从而实现层次间的松耦合。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;四、面向对象的设计原则：&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;1、&amp;#8220;开-闭&amp;#8221;原则（Open-Closed Principle,OCP）封装的问题 - 对可变性封装&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一个软件实体应当对扩展开放，对修改关闭。 你添加新功能的时候应该只是向代码集中添加新的代码不应该修改原来的代码。 &lt;/p&gt;&#xD;
&lt;p&gt;2、里氏代换原则（Liskov Substitution Principle, LSP） 职责的问题 - 如何进行继承&lt;br /&gt;&amp;nbsp;&amp;nbsp; LSP原则要求子类可以无条件的替代父类，子类不能对父类没有暴露的接口进行扩展，客户要调用功能只能通过父类暴露的接口来调用用不能擅自向子类调用。&lt;/p&gt;&#xD;
&lt;p&gt;3、依赖倒转原则（dependence inversion principle, DIP） 耦合度问题 - 针对接口编程&lt;br /&gt;&amp;nbsp;&amp;nbsp; 依赖倒转原则就是要实现依赖于抽象，抽象不要依赖于实现。要针对接口编程，不要针对实现编程。 &lt;/p&gt;&#xD;
&lt;p&gt;4、合成/聚合复用原则（Composite/Aggregate Reuse Principle或CARP） 复用问题 - 尽量使用组合/聚合、尽量不使用继承&lt;br /&gt;&amp;nbsp;&amp;nbsp; 在一个新的对象里面使用一些已有的对象，使之成为新对象的一部分；新的对象通过向这些对象的委派达到复用这些对象的目的。 &lt;/p&gt;&#xD;
&lt;p&gt;5、迪米特法则（Law of Demeter，LoD）&amp;nbsp; 耦合度问题 - 不要和陌生人说话&lt;br /&gt;&amp;nbsp;&amp;nbsp; 一个软件实体应当尽可能少的与其他实体发生相互作用。 迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖，因此，很容易使得系统的功能模块功能独立，相互之间不存在（或很少有）依赖关系。&lt;/p&gt;&#xD;
&lt;p&gt;6、接口隔离原则（interface separate principle, ISP） 职责单一 - 恰当的划分角色和接口&lt;br /&gt;&amp;nbsp;&amp;nbsp; 使用多个专门的接口比使用单一的总接口要好。也就是说，一个类对另外一个类的依赖性应当是建立在最小的接口上。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;五、目标与原则的关系&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可扩展性Extensibility&lt;br /&gt;&amp;nbsp;开/闭原则、里氏替换原则、依赖倒转原则、合成/聚合复用原则&lt;/p&gt;&#xD;
&lt;p&gt;灵活性Flexibility&lt;br /&gt;开/闭原则、Demeter 法则、接口隔离原&lt;/p&gt;&#xD;
&lt;p&gt;可插入性Pluggability&lt;br /&gt;开/闭原则、里氏代换原则、依赖倒转原则、合成/聚合复用原则&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1746515.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/05/28/1746515.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/04/11/1709617.html</id><title type="text">sql view</title><summary type="text">//ServerAUse pubsgoCreate table customers ( Customerid varchar(5) not null, CompanyName varchar(50) not null, ContactName varchar(30) null,CONSTRAINT PK_customers PRIMARY KEY CLUSTERED (Customerid), C...</summary><published>2010-04-11T08:52:00Z</published><updated>2010-04-11T08:52:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/04/11/1709617.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/04/11/1709617.html"/><content type="html">&lt;p&gt;//ServerA&lt;br /&gt;Use pubs&lt;br /&gt;go&lt;br /&gt;Create table customers (&lt;br /&gt;&amp;nbsp; Customerid&amp;nbsp; varchar(5) not null,&lt;br /&gt;&amp;nbsp; CompanyName varchar(50) not null,&lt;br /&gt;&amp;nbsp; ContactName&amp;nbsp; varchar(30) null,&lt;/p&gt;&#xD;
&lt;p&gt;CONSTRAINT PK_customers PRIMARY KEY CLUSTERED&amp;nbsp; (Customerid), &lt;br /&gt;CONSTRAINT&amp;nbsp;&amp;nbsp; CK_customerid&amp;nbsp;&amp;nbsp; CHECK (Customerid&amp;nbsp; between 'AAAAA'&amp;nbsp; and&amp;nbsp; 'LZZZZ')&lt;br /&gt;)&lt;/p&gt;&#xD;
&lt;p&gt;//Server B &lt;br /&gt;use pubs&lt;br /&gt;go&lt;br /&gt;Create table customers (&lt;br /&gt;&amp;nbsp; Customerid&amp;nbsp; varchar(5) not null,&lt;br /&gt;&amp;nbsp; CompanyName varchar(50) not null,&lt;br /&gt;&amp;nbsp; ContactName&amp;nbsp; varchar(30) null,&lt;br /&gt;CONSTRAINT PK_customers PRIMARY KEY CLUSTERED&amp;nbsp; (Customerid), &lt;br /&gt;CONSTRAINT&amp;nbsp;&amp;nbsp; CK_customerid&amp;nbsp;&amp;nbsp; CHECK (Customerid&amp;nbsp; between 'M'&amp;nbsp; and&amp;nbsp; 'ZZZZZ')&lt;br /&gt;)&lt;br /&gt;go&lt;br /&gt;//ServerA&lt;br /&gt;exec&amp;nbsp; sp_addlinkedserver&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @server='DPVSERVER1', @srvproduct='',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @provider='SQLOLEDB', @datasrc='ServerB'&lt;br /&gt;go&lt;br /&gt;exec&amp;nbsp; sp_addlinkedsrvlogin &lt;br /&gt;&amp;nbsp;@rmtsrvname =&amp;nbsp; 'DPVSERVER1'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , @useself =&amp;nbsp; 'false' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , @rmtuser =&amp;nbsp; 'sa' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , @rmtpassword = 'password' &lt;br /&gt;go&lt;br /&gt;//ServerB&lt;br /&gt;exec&amp;nbsp; sp_addlinkedserver&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @server='DPVSERVER2', @srvproduct='',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @provider='SQLOLEDB', @datasrc='ServerA'&lt;br /&gt;exec&amp;nbsp; sp_addlinkedsrvlogin &lt;br /&gt;&amp;nbsp;@rmtsrvname =&amp;nbsp; 'DPVSERVER2'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , @useself =&amp;nbsp; 'false' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , @rmtuser =&amp;nbsp; 'sa' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , @rmtpassword = 'password' &lt;br /&gt;go&lt;br /&gt;//ServerA&lt;br /&gt;Exec sp_serveroption 'DPVSERVER1', 'lazy schema validation', 'true'&lt;br /&gt;//Sever B&lt;br /&gt;Exec sp_serveroption 'DPVSERVER2', 'lazy schema validation', 'true'&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;//Server A：&lt;br /&gt;&amp;nbsp; Create view DPV_Customers&amp;nbsp; As&lt;br /&gt;&amp;nbsp;&amp;nbsp; Select *&amp;nbsp; from Customers &lt;br /&gt;&amp;nbsp;&amp;nbsp; Union all&lt;br /&gt;&amp;nbsp;&amp;nbsp; Select *&amp;nbsp; from&amp;nbsp; DPVSERVER1.Pubs.dbo.Customers&lt;br /&gt;//Server B&lt;br /&gt;&amp;nbsp;&amp;nbsp; Create view DPV_Customers&amp;nbsp; As&lt;br /&gt;&amp;nbsp;&amp;nbsp; Select *&amp;nbsp; from&amp;nbsp; DPVSERVER2.Pubs.dbo.Customers&lt;br /&gt;&amp;nbsp;&amp;nbsp; UNION ALL&lt;br /&gt;&amp;nbsp;&amp;nbsp; Select *&amp;nbsp; from Customers&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;set xact_abort on&lt;br /&gt;INSERT INTO DPV_CUSTOMERS VALUES('AAMAY','FUZHOU COMPANY','MARRY')&lt;br /&gt;INSERT INTO DPV_CUSTOMERS VALUES('CJOHN','XIMEN COMPANY','MARRY')&lt;br /&gt;INSERT INTO DPV_CUSTOMERS VALUES('SMITH','SHANGHAI COMPANY','TOM')&lt;br /&gt;INSERT INTO DPV_CUSTOMERS VALUES('YOUNG','FUJIAN COMPANY','JANE')&lt;br /&gt;INSERT INTO DPV_CUSTOMERS VALUES('GTOPP','BEJING COMPANY','TOM')&lt;br /&gt;INSERT INTO DPV_CUSTOMERS VALUES('QUILH','BEJING COMPANY','TOM')&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;//SELECT&amp;nbsp; *&amp;nbsp; FROM&amp;nbsp; DPV_Customers&amp;nbsp; order&amp;nbsp; by&amp;nbsp; customerid&lt;/p&gt;&#xD;
&lt;p&gt;//SELECT&amp;nbsp; *&amp;nbsp; FROM&amp;nbsp; DPV_Customers&amp;nbsp; WHERE&amp;nbsp; CustomerID= 'QUILH'&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;sql2005:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;alter database adventureWorks add filegroup [fg1]&lt;br /&gt;go&lt;br /&gt;alter database adventureWorks add filegroup [fg2]&lt;br /&gt;go&lt;br /&gt;alter database adventureWorks add filegroup [fg3]&lt;br /&gt;go&lt;br /&gt;alter database adventureWorks&lt;br /&gt;add file&lt;br /&gt;(name='fg1',&lt;br /&gt;&amp;nbsp;filename='c:\fg1.ndf',&lt;br /&gt;size=5mb)&lt;br /&gt;to filegroup [fg1]&lt;br /&gt;go&lt;br /&gt;alter database adventureWorks&lt;br /&gt;add file&lt;br /&gt;(name='fg2',&lt;br /&gt;&amp;nbsp;filename='d:\fg2.ndf',&lt;br /&gt;size=5mb)&lt;br /&gt;to filegroup [fg2]&lt;br /&gt;go&lt;br /&gt;alter database adventureWorks&lt;br /&gt;add file&lt;br /&gt;(name='fg3',&lt;br /&gt;&amp;nbsp;filename='e:\fg3.ndf',&lt;br /&gt;size=5mb)&lt;br /&gt;to filegroup [fg3]&lt;br /&gt;go&lt;br /&gt;use adventureWorks&lt;br /&gt;go&lt;br /&gt;Create partition function emailPF(nvarchar(50)) as range right for values ('G','N')&lt;br /&gt;go&lt;br /&gt;Create partition scheme emailPS as partition emailPF to (fg1,fg2,fg3)&lt;br /&gt;go&lt;br /&gt;Create table customermail (custid int, email nvarchar(50)) on emailPS(email)&lt;br /&gt;go&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1709617.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/04/11/1709617.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/03/30/1700968.html</id><title type="text">唐僧为什么可以领导孙悟空</title><summary type="text">小时候读西游记总有一个疑问&amp;#8212;&amp;#8212;那个唐僧那么无能，为什么孙悟空非要带着他去取经呢？如果孙悟空自己去取经，不就麻烦少多了么？后来长大了，工作了，先被人领导，之后又领导别人，总算明白了，原来唐僧领导孙悟空是有道理的，如果不是这样，取经这项伟大的事业就不能成功了。唐僧究竟有什么东西，是孙悟空没有的呢？究竟是什么因素让唐僧是一个领导，而孙悟空只是一个打工者呢 1. &amp;#8220;崇高...</summary><published>2010-03-30T14:31:00Z</published><updated>2010-03-30T14:31:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/03/30/1700968.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/03/30/1700968.html"/><content type="html">小时候读西游记总有一个疑问&amp;#8212;&amp;#8212;那个唐僧那么无能，为什么孙悟空非要带着他去取经呢？如果孙悟空自己去取经，不就麻烦少多了么？后来长大了，工作了，先被人领导，之后又领导别人，总算明白了，原来唐僧领导孙悟空是有道理的，如果不是这样，取经这项伟大的事业就不能成功了。唐僧究竟有什么东西，是孙悟空没有的呢？究竟是什么因素让唐僧是一个领导，而孙悟空只是一个打工者呢&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1. &amp;#8220;崇高信念&amp;#8221;&lt;br /&gt;　　第一个东西，唐僧有，而孙悟空没有的是&amp;#8220;崇高信念&amp;#8221;。唐僧在自己的崇高信念面前，丢掉性命都不会眨眼，而孙悟空就不会了，他能力很强，但是他没有坚定不移的信念，多次打退堂鼓。没有信念的人，就不能给别人以信心，就不能给别人以动力，遇到困难就容易退缩，领导者都胆怯了，退缩了，团队就会散掉；而信念不够崇高也不行，自私自利的信念，小富即安的信念，都让别人离你而去。我们对比一下水浒里的宋江，一个没有崇高信念的人，最后被招安了，他的最高理想就是这样，所以他就葬送了他的团队。&lt;br /&gt;　　现在有些&lt;span  onclick="tagshow(event)" href="tag.php?name=%C6%F3%D2%B5"&gt;企业&lt;/span&gt;家总是抱怨&lt;span  onclick="tagshow(event)" href="tag.php?name=%D4%B1%B9%A4"&gt;员工&lt;/span&gt;忠诚度不足，刚刚学会点&lt;span  onclick="tagshow(event)" href="tag.php?name=%D2%B5%CE%F1"&gt;业务&lt;/span&gt;，就跳槽了，刚刚结交几个客户，就自己去开公司了。这当然有社会的因素，有员工本身的原因，但是企业家也要自己检讨一下自己，你自己是否有崇高的信念。一个企业的终极目标是为老板创造更多的利润，并留下最多的钱给他的子女；而另一个企业的终极目标是为社会提供更加优质的产品和服务，企业家更是在去世之后把多数个人财产捐给社会；请问哪一个更配拥有忠诚的员工？&lt;br /&gt;　　2. &amp;#8220;无能&amp;#8221;也是一种领导者的财富&lt;br /&gt;　　第二个东西，唐僧有，而孙悟空没有的是&amp;#8220;无能&amp;#8221;。&amp;#8220;无能&amp;#8221;也是一种领导者的财富！唐僧那么无能，于是他就会欣赏有本事的人，能够包容能人们的其他缺点，才能找到三个有本事的徒弟来保护自己。如果唐僧神通广大，孙悟空就不会愿意跟着他了，正是因为唐僧无能，所以孙悟空就有了用武之地，就使得他可以充分实现自己的&lt;span  onclick="tagshow(event)" href="tag.php?name=%BC%DB%D6%B5"&gt;价值&lt;/span&gt;。&lt;br /&gt;　　我们看看能力很强的孙悟空，他本人在花果山的徒子徒孙，全部都是饭桶，没有一个有用的。他本事太大，他就瞧不起其他有本事的人，于是其他有本事的人就不喜欢跟着他。他自己太强，他的团队就变成一群饭桶。西游记有一章，孙悟空和唐僧闹翻了，自己搞了一个假团队打算去取经&amp;#8212;&amp;#8212;幸好没去，要不然见到厉害的妖怪，把孙悟空捉住，谁去救他呢？谁去搬救兵呢？他自己的团队都是饭桶，只好看着自己的领导送死。而唐僧就不会，别看他什么都不会，但是他却很安全。当年司马懿抓住蜀国的小兵，问他诸葛亮每天都干些什么，小兵想这个不算情报吧，就说丞相凡是责罚20杖以上的军法事宜，都要亲自监督。司马懿就知道了，诸葛亮肯定会被累死。&amp;#8212;&amp;#8212;太能干的领导，敌人没来，自己就累死了，而唐僧这个无能的长生肉，却还能一直很安全。&lt;br /&gt;&lt;span  onclick="tagshow(event)" href="tag.php?name=%D6%D0%B9%FA"&gt;中国&lt;/span&gt;很多企业都有一个非常能干的老板，同时带着一群饭桶员工。开始创业的时候，为了生存，可能是必须的，但是一旦生存问题解决了，企业家就要考虑怎么给员工搭建让他们发挥自己价值的&lt;span  onclick="tagshow(event)" href="tag.php?name=%C6%BD%CC%A8"&gt;平台&lt;/span&gt;，同时去寻找那些弥补自己不足的员工；而不是事必躬亲，甚至在一些专业问题上不懂装懂，这样一方面自己筋疲力尽，忙于应付，自然没有&lt;span  onclick="tagshow(event)" href="tag.php?name=%B7%A2%D5%B9"&gt;发展&lt;/span&gt;的余力；另一方面，员工也被矮化成&amp;#8220;手脚&amp;#8221;，企业就陷入了发展瓶颈。有些老板说，不成呀，我不放心呀，如果公司依赖于一个孙悟空，万一他使坏，我怎么办呀？呵呵，紧箍咒呢？要建立制度约束&amp;#8212;&amp;#8212;千万别忘了这个。&lt;br /&gt;3. &amp;#8220;仁德&amp;#8221;&lt;br /&gt;　　第三个东西，唐僧有，而孙悟空没有的是&amp;#8220;仁德&amp;#8221;。唐僧的仁德之心对妖怪都会怜悯性命，自然不会恶意算计自己的下属，克扣他们的&lt;span  onclick="tagshow(event)" href="tag.php?name=%B9%A4%D7%CA"&gt;工资&lt;/span&gt;，欺骗他们加班，对他们进行洗脑教育，利用他们承担法律责任，规避自身风险等等，唐僧虽然利用三个徒弟保护自己，但是又绝对没有恶意剥削他们的意思，而是带领他们一同努力，共同成长，一起成功。最后，唐僧的三个徒弟也都有了自己的成就，唐僧没有像赵匡胤一样，&amp;#8220;杯酒释兵权&amp;#8221;，或者&amp;#8220;飞鸟死，走狗烹&amp;#8221;。对比孙悟空，他的这种意识就差远了，他后来成了斗战胜佛，而他花果山的猴子们呢？还是一群猴子罢了。&lt;br /&gt;　　日本有一家企业，把员工的父亲们都请到公司里来和管理者座谈，企业老板对所有管理者说，当你们不知道该怎么对待自己的下属的时候，就回想一下今天，这些员工的父亲把孩子托付给你们，是希望你们可以教他们成长，带领他们成功。你们要想一想自己是否对得起这样的托付。&lt;br /&gt;　　中国的很多老板可能是受到了《资本论》的影响，认为做老板的只有剥削工人，才能够赚到钱，而且理所应当的认为资本的原始积累必须是肮脏的。其实，一个真正的领导是带领员工创造新的价值，带领他们一同成功的。国内有一个企业家曾自豪的说，我不想说我赚了多少钱，我只想告诉各位，我们创造了几十个百万富翁和千万富翁。&lt;br /&gt;　　4. &amp;#8220;人际关系&amp;#8221;&lt;br /&gt;　　第四个东西，唐僧有，而孙悟空没有的是&amp;#8212;&amp;#8212;&amp;#8220;人际关系&amp;#8221;。唐僧的前生就是释迦牟尼佛的弟子了，而孙悟空天生地造的一个没有任何关系&lt;span  onclick="tagshow(event)" href="tag.php?name=%CD%F8%C2%E7"&gt;网络&lt;/span&gt;的石猴子，虽然也拜了一个师父，但是和师兄弟关系都不好，还被师父赶走了；和牛魔王拜把子，后来又闹翻了；和东海龙王是邻居，还抢了人家的东西；和二郎神等一些天官天将是同事，可是不给人家面子，后来还大闹天宫踢了很多人的屁股。总之，孙悟空的人际关系不大好。&lt;br /&gt;　　而唐僧就不同了。他见到神仙就磕头，没有任何仇家。他不仅是如来佛的弟子，还是唐王李世民的拜把兄弟。人神两届的高层关系他都有了。人际关系不仅仅是好，而且还都是高层关系，通天的关系呀，这样的人做老板，就会顺风顺水。&lt;br /&gt;　　社会是由人构成的，这个地球如果没有了人，一切财富，一切物质都没有任何意义。人是这个世界上最本质的资源，是所有财富的创造者。一个老板，要懂得对外创造人际关系资源，对内创造优质人才资源。&lt;br /&gt;　　唐僧比孙悟空多了什么东西呢，那就是有崇高信念，无能但是懂得用人，有仁德之心，具有良好的人际关系，所以唐僧可以做领导，来领导孙悟空，而孙悟空虽然是我们心目中的英雄，但是他自己做不成伟大的事业，他必须要依靠一个唐僧一样的领导来带领。从这个意义上看，唐僧才是英雄，至少应该是我们企业家崇拜的英雄。&lt;br /&gt;闲言碎语&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;font color="#fe2419"&gt;用人所长，则天下无不可用之人；用人所短，则天下无可用之人&lt;/font&gt;&lt;br /&gt;这一句话也是看后收藏的，觉得非常有道理，对于一个公司老板，怎么管理和组织团队，还是在于用人，毕业5年出来，工作了几家公司，感觉小公司的老板都很会用人，利用有限的人力，却干出了很多的事情！对比大公司和小公司的区别：&lt;br /&gt;1、大公司基本见不到老板的面，永远没有家的感觉，一切工作只为薪水，一旦失去高薪，员工会毫不犹豫的离去，而小公司老板经常和员工讨论、奋斗！一起工作，一起为事业而战，员工为和老板的交情而工作，薪水不会在乎，在乎的是得到老板的赏识！&lt;br /&gt;2、大公司一旦管理不好，就会出现断层，基层和领导断层，毫无沟通，各自为战，把事情越做越乱！小公司管理灵活，沟通方便！&lt;br /&gt;3、大公司高要求的运作，必然带来高成本、低效率的工作，小公司只要完成目标就好，低成本、高效率的去做！&lt;br /&gt;人还是公司成败的主要因素，一旦员工失去了家的感觉，必然会离家出走！公司为什么留不住人，老板是否该要反思了，是否有唐僧的领导气质和特性？老板是要做唐僧还是孙悟空？&lt;br /&gt;对于个人创业，我当然愿意做孙悟空，但是随着公司的发展，还是要学学唐僧，慢慢的放权，交给更多的孙悟空做事！&lt;br /&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1700968.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/03/30/1700968.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hq2008/archive/2010/03/10/1682703.html</id><title type="text">项目与产品区别</title><summary type="text">项目与产品区别 咨询项目：咨询项目通常会包括二种，一种是只做咨询，像北大纵横他们只提供IT咨询，但不包括实施，还有一种就是打包，咨询和实施一起做了，给客户提供解决方案和完成网站的开发上线实施。Techsailor有些项目就是走咨询线路。 产品它基本上定位于满足产品目标用户的需求，并且努力去提高用户的体验和提升产品的值价。 我们来做个简单的比较吧。 比较项 定位 策划 核心(干系人) 管理 技术 商...</summary><published>2010-03-10T08:30:00Z</published><updated>2010-03-10T08:30:00Z</updated><author><name>hq5460</name><uri>http://www.cnblogs.com/hq2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hq2008/archive/2010/03/10/1682703.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hq2008/archive/2010/03/10/1682703.html"/><content type="html">&lt;div&gt; &lt;p&gt;&lt;strong&gt;项目与产品区别&lt;/strong&gt;&lt;/p&gt; &lt;/div&gt;  &lt;div id="blog_article"&gt; &lt;div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;咨询项目：咨询项目通常会包括二种，一种是只做咨询，像北大纵横他们只提供IT咨询，但不包括实施，还有一种就是打包，咨询和实施一起做了，给客户提供解决方案和完成网站的开发上线实施。Techsailor有些项目就是走咨询线路。&lt;/p&gt; &lt;p&gt;产品它基本上定位于满足产品目标用户的需求，并且努力去提高用户的体验和提升产品的值价。&lt;/p&gt; &lt;p&gt;我们来做个简单的比较吧。&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;strong&gt;比较项&lt;/strong&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;strong&gt;定位&lt;/strong&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;strong&gt;策划&lt;/strong&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;strong&gt;核心(&lt;/strong&gt;&lt;strong&gt;干系人)&lt;/strong&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;strong&gt;管理&lt;/strong&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;strong&gt;技术&lt;/strong&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;strong&gt;商业目标&lt;/strong&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;咨询项目&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;提供达到客户预期目标的整套&lt;span style="color: red;"&gt;解决方案，以客户的用户为中心，以客户的利益为核心&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;策划的基本方向是以&lt;span style="color: red;"&gt;客户的商业目标和&lt;span style="color: red;"&gt;客户的用户群体&lt;/span&gt;为中心&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;以客户的主脑，或项目负责人为需求的核心&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;&lt;span style="color: red;"&gt;一次性&lt;/span&gt;活动，有可预见的项目生命周期&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;针于客户现状和可预测的一段时期内变化的&lt;span style="color: red;"&gt;需求现实&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;完成客户的最终商业目标的一个整合，实现双赢&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;产品&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;为产品使用目标群体提供有价值的&lt;span style="color: red;"&gt;服务，致力于提升产品的&lt;span style="color: red;"&gt;价值和服务&lt;/span&gt;水平&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;基于&lt;span style="color: red;"&gt;产品的目标群体用户的需求和用户心理，用户体验为核心&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;以产品经理的策划为核心&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;不是一次性的项目，而是&lt;span style="color: red;"&gt;可持续性发展的产品&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;以&lt;span style="color: red;"&gt;可扩展和&lt;span style="color: red;"&gt;可持续性发展&lt;/span&gt;为核&lt;/span&gt;心的稳定产品&lt;/p&gt; &lt;p style="line-height: normal; margin-bottom: 0pt;"&gt;能让产品的价值持续的提升，创造更多的商业利润&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;以上的表格只是做了一个简单的比较，它们的区别在于，出发点和目标不一样，所以体现出来的实际工作中的策划和实施面都会有不同的重点。 特别是在组织架构上的区别比较大些，项目基本上是以项目经理和项目干系人的沟通为主，以客户对项目的进度要求为准。产品很大的成份上是以产品经理的策划为 核&lt;/span&gt;心，产品经理需要对产品的概念到设计，定位，运营，商业运作等有很清晰的规划，产品经理在整个产品应该有不可替代的&amp;#8220;权威&amp;#8221;，这样才能保持产品方向的一致性。产品的进度基本上是以产品的商业运作要求为准来调整上线的策略。&lt;/p&gt; &lt;p&gt;从管理&lt;span&gt;职责上重点描述下它俩的区别，这样会更加清楚些。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: red;"&gt;项&lt;/span&gt;&lt;span style="color: red;"&gt;目经理的职责&lt;/span&gt;是在一定的目标、范围、时间期限、预算以及其他制约条件下，试图一次性完成一个成功的项目。一个项目经理需要分配资源，管理问题与风险，并且主要协调所有的各种必要因素以完成项目。当把他们跟产品联系起来时，项目也可能被要求承担起创建一个产品，为产品提供新的特征，或者是为产品创建新的版本或扩展的任务。当项目完成时，项目经理通常会被转移到一个新的项目，甚至有可能是服务于一个完全不同的产品。&lt;/p&gt; &lt;p&gt;&lt;span style="color: red;"&gt;产品经理的职责&lt;/span&gt;是从头到尾的服务一个产品，并使得产品持续成功。一旦创建产品的项目完成，而且项目经理转移到下一个工作，产品经理依然会留下来管理产品，直至产品的整个生命周期。其他项目被联系到产品可能是由于产品经理的发起，产品经理会始终在产品生命周期，定义项目的目标，并带领团队完成拟定的商业目标。&lt;/p&gt; &lt;p&gt;好的产品经理和好的项目经理能在冲突中找到平衡。好的项目经理明白，一个项目真正的成功并不是看它是否在规定的时间和预算内完成，而是它是否达到了拟定的目标和任务。好的产品经理则明白，如果项目被不断延期并且从未投入市场，又或者因为大大超过预算而被结束，那么所有的产品功能特征都会变得毫无意义。&lt;/p&gt; &lt;p&gt;产品有3个要素：一是&lt;span&gt;用户，产品首先是针对特定的用户群体而开发的，以满足他们的需求为目的。二是情境，产品需要在一定的环境、条件下才能正常使用，也就是产品工作有其限制性。三是功能，产品的意义在于它能满足用户需求，能带来功用价值。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 做产品的时候，需要坚持一条基本原则：用户是傻子，要从最简单的方面入手，充分考虑用户&lt;span&gt;体验；此外，要意识到产品是有生命的，通过它就能让用户自动明白：这是什么产品，如何使用等，而不需要专门的人员培训&lt;/span&gt;。&lt;/p&gt; &lt;p&gt;做产品的目的是为了满足需求，而产品需求细分为3个档次，逐级提升。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 最底层是以用户需求为中心，做到理解并适应用户需求；中间层是媒体需求的满足，开始引导并教育用户行为；最高级别的需求是由产品市场来决定，在不知不觉中达到控制和改变用户行为的目的。&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/hq2008/aggbug/1682703.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hq2008/archive/2010/03/10/1682703.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
