<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_ALinq －－最为完美的 Linq to DB 解决方案</title><subtitle type="text">移植 Linq to SQL 的利器（Linq to Access、SQLite、MySQL、Oracle、Firebird、PostgreSQL、DB2）</subtitle><id>http://feed.cnblogs.com/blog/u/28328/rss</id><updated>2012-01-18T01:14:44Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/28328/rss"/><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/12/04/2275241.html</id><title type="text">在 ALinq  中使用事务</title><summary type="text">下面是 ALinq 使用事务的例子，比较简单，直接上代码：var db = new AccessNorthwind("C:/Northwind.mdb") { Log = Console.Out };db.DoTransaction(delegate(){ db.Customers.Update(o =&gt; new Customer { CompanyName = "XXXX" }, o =&gt; o.CustomerID == "kkkkk"); db.Customers.Delete(o =&gt; o.CustomerID</summary><published>2011-12-04T02:05:00Z</published><updated>2011-12-04T02:05:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/12/04/2275241.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/12/04/2275241.html"/><content type="html">&lt;p&gt;下面是 ALinq 使用事务的例子，比较简单，直接上代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; db = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AccessNorthwind(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C:/Northwind.mdb&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) { Log = Console.Out };&lt;br /&gt;db.DoTransaction(&lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;    db.Customers.Update(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Customer { CompanyName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;XXXX&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; }, o =&amp;gt; o.CustomerID == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;kkkkk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    db.Customers.Delete(o =&amp;gt; o.CustomerID == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;aaaaa&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;});&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Utility&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; DoTransaction(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; DataContext dc, Action func)&lt;br /&gt;    {&lt;br /&gt;        dc.Connection.Open();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; tran = dc.Connection.BeginTransaction();&lt;br /&gt;        dc.Transaction = tran;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            func();&lt;br /&gt;            tran.Commit();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            tran.Rollback();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            dc.Connection.Close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;有朋友问到，如果是用 SQL 的，怎么写， OK，再上一个 SQL 的例子：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; str = &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OleDbConnection(str).DoTransaction(&lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt;(IDbCommand command)&lt;br /&gt;{&lt;br /&gt;    command.CommandText = &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UPDATE [Customers]&lt;br /&gt;                            SET [CompanyName] = @p0&lt;br /&gt;                            WHERE [CustomerID] = @p1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;    command.Parameters.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OleDbParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@p0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;XXXXX&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;    command.Parameters.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OleDbParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@p1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;kkkkk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;    command.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;    command.CommandText = &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DELETE FROM [Customers] WHERE [CustomerID] = @p0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;    command.Parameters.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OleDbParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@p0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;aaaaa&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;    command.ExecuteNonQuery();&lt;br /&gt;});&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Utility&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; DoTransaction(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; DataContext dc, Action func)&lt;br /&gt;    {&lt;br /&gt;        dc.Connection.Open();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; tran = dc.Connection.BeginTransaction();&lt;br /&gt;        dc.Transaction = tran;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            func();&lt;br /&gt;            tran.Commit();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            tran.Rollback();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            dc.Connection.Close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2275241.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/12/04/2275241.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/10/20/2218525.html</id><title type="text">ALinq3 新功能简介 （五）[未完，待续]</title><summary type="text">四、动态查询（一）7、数据处理1）更新操作使用 Linqtable.Update(o =&gt; new Employee { FirstName = "AAA", LastName = "BBB" }, o =&gt; o.EmployeeID == -1);动态更新table.Update("FirstName = 'AAA', LastName = 'BBB'", "EmployeeID == -1");使用参数table.Update("FirstName = @0</summary><published>2011-10-20T02:45:00Z</published><updated>2011-10-20T02:45:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/10/20/2218525.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/10/20/2218525.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 16px;"&gt;四、动态查询（一）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7、数据处理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1）更新操作&lt;/p&gt;&lt;p&gt;使用 Linq&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Update(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Employee { FirstName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; }, o =&amp;gt; o.EmployeeID == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;动态更新&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Update(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName = 'AAA', LastName = 'BBB'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID == -1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;使用参数&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Update(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName = @0, LastName = @1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID == @2&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;更新部份采用 Linq ，过滤条件采用动态&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Update(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { FirstName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; }, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID == -1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;更新部份采用动态，过滤条件采用 Linq&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Update(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName = 'AAA', LastName = 'BBB'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, o =&amp;gt; o.EmployeeID == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;2）插入操作&lt;/p&gt;&lt;p&gt;使用 Linq&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var employeeID = table.Insert(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Employee { FirstName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; });&lt;/div&gt;&lt;p&gt;动态插入&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var employeeID = table.Insert(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName = 'AAA', LastName = 'BBB'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;3）删除操作&lt;br /&gt;使用 Linq&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Delete(o =&amp;gt; o.EmployeeID == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;动态删除&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Delete(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID == -1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;table.Delete(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID == @0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;&lt;strong&gt;8、使用索引&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1）查询&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;MyEmployee&amp;gt;();&lt;br /&gt;table.Select(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { FisrtName = o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FisrtName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;], LastName = o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] }).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;new (['FirstName'] as FirstName, ['LastName'] as FirstName)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;简写一：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;['FirstName'] as FirstName, ['LastName'] as FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;简写二：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;['FirstName'],  ['LastName']&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;简写三：（FirstName，LastName 字段的引号可以不要）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;[FirstName],  [LastName]&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;关于使用索引入进增删改操作，以下的使用，是不允许的：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Insert(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;[FirstName] = 'AAA', [LastName] = 'BBB'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Insert(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;[FirstName] = 'AAA', [LastName] = 'BBB'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;[EmployeeID] == -1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;应该改写如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Insert(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName = 'AAA', LastName = 'BBB'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Insert(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName = 'AAA', LastName = 'BBB'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID == -1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;&lt;br /&gt;关于动态查询就到此结束了，后面还会有更多精彩内容，请继续关注我的博客。有什么问题或者建议，可以随时给我留言。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2218525.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/10/20/2218525.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/10/18/2214199.html</id><title type="text">ALinq3 新功能简介 （四）[未完，待续]</title><summary type="text">四、动态查询（一）ALinq2 是没有自己的动态查询的，很多用户都是采用 Linq to SQL 的动态查询库（Linq to SQL Dynamic），但是，这里个库并不完善，并且也不再跟新维护了。而且，这个库并非专门为 ALinq 设计的，并不支持一些 ALinq 专有的功能。不少用户在使用这个库的时候，碰到不少问题，来找我们寻求帮助。因此，我们决定亲自实现，并且为 ALinq 度身定做，现在已经集成在 ALinq3 里面了。1、匿名类对象的创建1）使用 new 关键字创建匿名类对象。示例一：Linq 查询var table = db.GetTable&lt;Employee&gt;();</summary><published>2011-10-18T03:28:00Z</published><updated>2011-10-18T03:28:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/10/18/2214199.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/10/18/2214199.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 16px;"&gt;四、动态查询（一）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ALinq2 是没有自己的动态查询的，很多用户都是采用 Linq to SQL 的动态查询库（Linq to SQL Dynamic），但是，这里个库并不完善，并且也不再跟新维护了。而且，这个库并非专门为 ALinq 设计的，并不支持一些 ALinq 专有的功能。不少用户在使用这个库的时候，碰到不少问题，来找我们寻求帮助。因此，我们决定亲自实现，并且为 ALinq 度身定做，现在已经集成在 ALinq3 里面了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、匿名类对象的创建&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1）使用 new 关键字创建匿名类对象。&lt;/p&gt;&lt;p&gt;示例一：&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { o.FirstName, o.LastName }).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;new (FirstName, LastName)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;可简写为&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName, LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;&lt;br /&gt;示例二：&lt;br /&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { F = o.FirstName, L = o.LastName }).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;new ([FirstName] as F, [LastName] as L)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;可简写为&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName as F, LastName as L&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;示例三：&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(o =&amp;gt; o.FirstName).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;示例四：&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; {F = o.FirstName }).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;new (FirstName as F)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;可简写为&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName as F&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、属性的访问&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以使用 .属性名称 访问属性&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(o =&amp;gt; o.ReportsToEmployee.FirstName).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ReportsToEmployee.FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、数据类型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1）字符串&lt;/p&gt;&lt;p&gt;你可以使用 " 或 ' 引用字符串。&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName + \" \" + LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;或者&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName + ' ' + LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;2）数字&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID &amp;lt; 100&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();  &lt;/div&gt;&lt;p&gt;3）日期&lt;/p&gt;&lt;p&gt;使用 #日期# 来表示日期类型，如：#2011-10-7#&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Birthdate &amp;lt; #2011-1-1#&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();  &lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、运算&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1）字符串连接&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName + ' ' + LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2）数值运算&lt;/p&gt;&lt;p&gt;示例一：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;OrderDetail&amp;gt;();&lt;br /&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UnitPrice + 1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;&amp;gt;().ToArray();&lt;br /&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UnitPrice - 1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;&amp;gt;().ToArray();&lt;br /&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UnitPrice * 2&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;&amp;gt;().ToArray();&lt;br /&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UnitPrice / 2&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3）逻辑运算&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UnitPrice &amp;gt; 0 &amp;amp;&amp;amp; OrderID &amp;gt; 0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UnitPrice &amp;gt; 0 || OrderID &amp;gt; 0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;!(UnitPrice &amp;gt; 0)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4）类型转换&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(string)[FirstName] == 'AAA'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5、支持的类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;动态查询支持的类有 DateTime、Converter、Math 和 String&lt;/p&gt;&lt;p&gt;1）类的创建：&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Where(o =&amp;gt; o.BirthDate &amp;lt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime(&lt;span style="color: #800080;"&gt;1999&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Birthdate &amp;lt; DateTime(1999,1,1)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;/div&gt;&lt;p&gt;注意：创建对象实例不需要 new 关键字。&lt;/p&gt;&lt;p&gt;2）访问类的静态方法&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Select(o =&amp;gt; Convert.ToString(o.EmployeeID)).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Select(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Convert.ToString(EmployeeID)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Cast&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;().ToArray();&lt;/div&gt;&lt;p&gt;3）访问类的静态属性&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Where(o =&amp;gt; o.BirthDate &amp;lt; DateTime.Now);&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BirthDate &amp;lt; DateTime.get_Now()&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;/div&gt;&lt;p&gt;注意，&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;不能&lt;/span&gt;&lt;/strong&gt;使用下面的语句访问类的静态属性，会引起歧义（解释成 Employee.DateTime.Now）：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BirthDate &amp;lt; DateTime.Now&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;/div&gt;&lt;p&gt;4）数组的使用&lt;/p&gt;&lt;p&gt;Linq 查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Where(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; }.Contains(o.FirstName)).ToArray();&lt;/div&gt;&lt;p&gt;动态查询&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;string['AAA', 'BBB'].Contains(FirstName)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).ToArray();&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6、参数的使用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;参数的名称必由 @ 和数字组成， 例如：@0，@1 等等。&lt;/p&gt;&lt;p&gt;示例&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;Employee&amp;gt;();&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BirthDate &amp;lt; @0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, DateTime.Now).ToArray();&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BirthDate.Value.Month &amp;lt; @0.Month&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, DateTime.Now).ToArray();&lt;br /&gt;&lt;br /&gt;var names = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CCC&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; };&lt;br /&gt;table.Where(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@0.Contains(FirstName)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;[] { names }).ToArray();&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2214199.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/10/18/2214199.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/10/13/2209954.html</id><title type="text">ALinq3 新功能简介 （三）[未完，待续]</title><summary type="text">三、基于接口的数据操作这个功能，主要是解决 ALinq 单表继承的一些不足之处。先来看一个实例。有一 CMS 系统，无论文章，还是类别，都要实现可能让用户自行调整次序的功能。那么我们可以设定这么一个接口：interface OrdinalEntity{int ID{get;}int ordinal{get;set;}}然后，类别和文章分别从该接口继承，下面的都是伪代码，为了说明问题。public class Category：OrdinalEntity{ public int ID; public int Ordinal; public string Name;}public...</summary><published>2011-10-13T03:11:00Z</published><updated>2011-10-13T03:11:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/10/13/2209954.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/10/13/2209954.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 16px;"&gt;三、基于接口的数据操作&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个功能，主要是解决 ALinq 单表继承的一些不足之处。先来看一个实例。&lt;/p&gt;&lt;p&gt;有一 CMS 系统，无论文章，还是类别，都要实现可能让用户自行调整次序的功能。那么我们可以设定这么一个接口：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt; OrdinalEntity&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID{&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ordinal{&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;}&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;然后，类别和文章分别从该接口继承，下面的都是伪代码，为了说明问题。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Category：OrdinalEntity&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Ordinal;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Name;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Article：OrdinalEntity&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Ordinal;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Title;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Content;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;br /&gt;那么我们可以定义这样的数据操作用来交换位置：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Switch&amp;lt;T&amp;gt;(T item1, T item2) &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; T &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; OrdinalEntity, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;        DoTranscation(db， &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt;(){&lt;br /&gt;                  var table = db.GetTable&amp;lt;T&amp;gt;();&lt;br /&gt;                  table.Update(o=&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; T { Ordinal = item1.Ordinal }, &lt;br /&gt;                                      o=&amp;gt; o.ID == item2.ID);&lt;br /&gt;&lt;br /&gt;                   table.Update(o=&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; T { Ordinal = item2.Ordinal }, &lt;br /&gt;                                      o=&amp;gt; o.ID == item1.ID);&lt;br /&gt;         }               &lt;br /&gt;}  &lt;/div&gt;&lt;p&gt;我们还可以让定这样的函数来删除数据：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;public void Delete&amp;lt;T&amp;gt;(int id) where T is OrdinalEntity&lt;br/&gt;{&lt;br/&gt;        db.GetTable&amp;lt;T&amp;gt;().Delete(o=&amp;gt; o.ID == id);&lt;br/&gt;}&lt;/div&gt;&lt;p&gt;总之，可以基本于接口来处理数据，而不是具体的类，这样就大大加强了代码的复用。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2209954.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/10/13/2209954.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/10/12/2207324.html</id><title type="text">ALinq3 新功能简介 （二）[未完，待续]</title><summary type="text">在上一篇文章介绍了索引器影射的概念，我们现在再来深入了解一下索引器影射，文章的结尾，会答复一些朋友提到的问题。二、深入理解索引器影射我们先来定义一个实体类，注意到，我们在这里定义了一个 ID 属性，并且把它影射到了 EmployeeID 列。[Table(Name = "Employees")]class MyEmployee{ private Dictionary&lt;string, object&gt; values; public MyEmployee() { this.values = new Dictionary&lt;string, object&gt;();</summary><published>2011-10-12T09:49:00Z</published><updated>2011-10-12T09:49:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/10/12/2207324.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/10/12/2207324.html"/><content type="html">&lt;p&gt;在上一篇文章介绍了索引器影射的概念，我们现在再来深入了解一下索引器影射，文章的结尾，会答复一些朋友提到的问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 16px;"&gt;二、深入理解索引器影射&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们先来定义一个实体类，注意到，我们在这里定义了一个 ID 属性，并且把它影射到了 EmployeeID 列。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Table(Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyEmployee&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt; values;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; MyEmployee()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.values = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Column(Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, IsDbGenerated = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;, IsPrimaryKey = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Column(Storage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;values&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;[&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; key]&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (key)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ID;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; value;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (values.TryGetValue(key, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; value))&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; value;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (key)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;                    ID = Convert.ToInt32(value);&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;                    values[key] = value;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;接着来看下面的一个查询：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;db.GetTable&amp;lt;MyEmployee&amp;gt;().Select(o =&amp;gt; o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;]).ToArray();&lt;/div&gt;&lt;p&gt;结果如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: AccessDbProvider Model: Access AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;从上面我们可以看到，查询的列为成了 EmployeeID 了，而并非索引的键值 ID 。&lt;/p&gt;&lt;p&gt;ALinq 的影射，由属性映射和索引器影射构成（当然，索引器也是属性，但为了方便描述，区分开来），由于属性是静态的，在编译阶段确定，因此，把属性映射到字段，不能适应表中字段数的变化。索引器，由键值组成，把键映射到字段中去，全能好好地适应字段数目的变化，我们可以把索引器的键值，理解为若干个属性，键为属性名称，对应的值为属性值。在使用索引器映射时，会首先利用键（相当于属性名称）检索属性映射，如果在属性映射中找不到对应的属性，就把它添加到索引器影射中。在上面的例子中，由于 ID 属性已经存在，并且影射到了 EmployeeID ，因为，使用的是静态中的影射。&lt;/p&gt;&lt;p&gt;再来看一个例子，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;db.GetTable&amp;lt;MyEmployee&amp;gt;().Select(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { ID = o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;], FirstName = o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] }).ToArray();&lt;/div&gt;&lt;p&gt;生成的 SQL 如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: AccessDbProvider Model: Access AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;从这里我们可以看得到，索引字段 FirstName 直接转换成了 FirstName 字段，这里因为在静态索引里面没有 FirstName 属性的影射。&lt;/p&gt;&lt;p&gt;在使用索引器映射的时候，有几个值得注意的地方：&lt;/p&gt;&lt;p&gt;1、值的一致性，我们通过键来获得属性值，应该和直接使用属性获得的值一致。&lt;/p&gt;&lt;p&gt;即：o["ID"] 和 o.ID 应该是相同的，所以你可以看到，在索引器的代码中，有这样的一段：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (key)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ID;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; value;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (values.TryGetValue(key, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; value))&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; value;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;2、索引器映射配置中的 Storage 值，如果你是使用 SubmitChange 来更新数据，不能省略该值。先来发看例子：&lt;/p&gt;&lt;p&gt;插入操作：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var item = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MyEmployee();&lt;br /&gt;item[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CCC&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;item[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DDD&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;var table = db.GetTable&amp;lt;MyEmployee&amp;gt;();&lt;br /&gt;table.InsertOnSubmit(item);&lt;br /&gt;&lt;br /&gt;db.SubmitChanges();&lt;/div&gt;&lt;p&gt;生成的 SQL&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;INSERT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;INTO&lt;/span&gt; `Employees`(`FirstName`, `LastName`)&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;VALUES&lt;/span&gt; (&lt;span style="color: #008000;"&gt;@p0&lt;/span&gt;, &lt;span style="color: #008000;"&gt;@p1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; LAST_INSERT_ID() &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; `Value`&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p0: Input VarChar (Size = 3; Prec = 0; Scale = 0) [CCC]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p1: Input VarChar (Size = 3; Prec = 0; Scale = 0) [DDD]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: MySqlProvider Model: MySql AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;更新操作：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;MyEmployee&amp;gt;();&lt;br /&gt;var item = table.OrderByDescending(o =&amp;gt; o.ID)&lt;br /&gt;                .First();&lt;br /&gt;&lt;br /&gt;item[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;item[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;db.SubmitChanges();&lt;br /&gt;&lt;br /&gt;item[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;item[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;db.SubmitChanges();&lt;/div&gt;&lt;p&gt;生成的 SQL&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; `t0`.`EmployeeID` &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; `ID`&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; `Employees` &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; `t0`&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;BY&lt;/span&gt; `t0`.`EmployeeID` &lt;span style="color: #0000ff;"&gt;DESC&lt;/span&gt;&lt;br /&gt;LIMIT &lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: MySqlProvider Model: MySql AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;UPDATE&lt;/span&gt; `Employees`&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;SET&lt;/span&gt; `FirstName` &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p1&lt;/span&gt;, `LastName` &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; `EmployeeID` &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [22]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p1: Input VarChar (Size = 3; Prec = 0; Scale = 0) [AAA]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p2: Input VarChar (Size = 3; Prec = 0; Scale = 0) [BBB]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: MySqlProvider Model: MySql AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;和查询一样，使用 Submit 来更新数据的时候，同样要首先对表的映射作一次扫描。每更新一个对象就扫描一次，可能会有朋友问题，会不会影响到效率？可以肯定地说，如果你能接受到了 ALinq 之前版本或者 Linq to SQL 的效率，这样性能肯定也能接受。映射都是采用键值来储存的，访问一次的时间极其的短。对于整个流程来说，可以忽略不计。那么，是如何进判断的呢？首先通过索引器映射配置中的 Storage，在这个例子里为 &amp;ldquo;value&amp;rdquo;，通过反射，找到该字段，然后把所有的键都找出来，逐一判断。如果没有，则添加到映射中去。&lt;/p&gt;&lt;p&gt;在 Update 的例子中，我们发现，SubmitChages&amp;nbsp;两次，但是只更新了一次。是不是发现，使用索引器，和使用属性一样方便，好用呢。^_^&lt;/p&gt;&lt;p&gt;使用索引器与使用属性的行为、结果是一致的，是我们的设计准则之一。也就是说：&lt;/p&gt;&lt;p&gt;所有使用 o["ID"] 和 o.ID，o["FirstName"] 和 o.FirstName，无论查询，还是删改数据，都应该具有是一样的结果。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3、设置主键属性映射 如果你要使用 SubmitChanges 来更新，这个是必须的，因为，无法自动判断一个键是否为主键。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上一篇有朋友问到，下面的插入操作，如何返回自增长列。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var key = table.Insert&amp;lt;int&amp;gt;(o =&amp;gt; new { FirstName = "AAA", LastName = "BBB" });&lt;br/&gt;&lt;/div&gt;&lt;p&gt;办法就是加一个属性的映射，并设 IsDBGenerated &amp;nbsp;为 true ，便可以返回一个自增长的主键值了。&lt;/p&gt;&lt;p&gt;还有更多精采内容陆续介绍给大家，请关注我的博客，谢谢大家的阅读。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2207324.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/10/12/2207324.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/10/10/2205710.html</id><title type="text">ALinq3 新功能简介 （一）[未完，待续]</title><summary type="text">在正文开始之前，先聊些题外话，和一些同行聊天的时候，告诉他们，我是专门做 ORM 的，而且还能卖钱，都表示很惊讶，在 ORM 泛滥的今天，N 多 ORM 都是求着别人用的，ALinq 竟然能收费。我跟他们说，“如果你想知道为什么，亲自下载来用一下。”我的用户虽然不多，但是，绝对都是铁杆用户，前段时间一位巴西的用户，换了新工作，到了新公司后，立马向他们公司推荐购买 ALinq 。我们做产品，一直坚持的原则就是为客户解决他们在实际开发中碰到的问题。由于我们的产品切切实实解决了用户所碰到难题，所以很受用户的喜欢。如果说 ALinq 2.0 主要专注于解决 Linq to SQL 在无法应用于多数库的</summary><published>2011-10-10T10:41:00Z</published><updated>2011-10-10T10:41:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/10/10/2205710.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/10/10/2205710.html"/><content type="html">&lt;p&gt;在正文开始之前，先聊些题外话，和一些同行聊天的时候，告诉他们，我是专门做 ORM 的，而且还能卖钱，都表示很惊讶，在 ORM 泛滥的今天，N 多 ORM 都是求着别人用的，ALinq 竟然能收费。我跟他们说，&amp;ldquo;如果你想知道为什么，亲自下载来用一下。&amp;rdquo;我的用户虽然不多，但是，绝对都是铁杆用户，前段时间一位巴西的用户，换了新工作，到了新公司后，立马向他们公司推荐购买 ALinq 。我们做产品，一直坚持的原则就是为客户解决他们在实际开发中碰到的问题。由于我们的产品切切实实解决了用户所碰到难题，所以很受用户的喜欢。&lt;/p&gt;&lt;p&gt;如果说 ALinq 2.0 主要专注于解决 Linq to SQL 在无法应用于多数库的问题，那么，ALinq 3.0 专注的是解决 Linq to SQL 动态方面的问题。&lt;/p&gt;&lt;p&gt;ALinq 3.0 将有三大创新来解决这个问题，让用户使用得更爽。&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;一、索引器影射&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;索引器影射，在 ALinq 3.0 中，是一个重要的概念，简单地说，就是将属性或者列映射到索引器中。这个功能的实现，主要解决的问题是：&lt;/p&gt;&lt;p&gt;很多用户在开发 MIS 系统的时候，很多时候都需要在运行时对列进行添加。在园子里曾经看到有朋友给出一个解决的办法，就是动态生成类，然后再动态生成 Lambda 表达式，烦锁的不得了。现在，ALinq 在 ORM 内部来解决这个问题。我们先来看看下面的例子：&lt;/p&gt;&lt;p&gt;先定义一个实体类，但你会发现，除了一个索引器外，其它的属性一无所有，我们将通过索引器来进行影射。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Table(Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyEmployee&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt; values;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; MyEmployee()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.values = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt;();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Column]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;[&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; key]&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; values[key]; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; { values[key] = value; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、数据查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下面是一个查询的例子&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;db.GetTable&amp;lt;MyEmployee&amp;gt;()&lt;br /&gt;    .Select(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { F = o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;], L = (&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;)o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] })&lt;br /&gt;    .ToArray(); &lt;/div&gt;&lt;p&gt;生成的 SQL 是：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;F&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;L&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: AccessDbProvider Model: Access AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;工作原理：ALinq 在执行查询的时候，会先对表达式扫描一遍，如果发现具有索引器的字段，就将它加入到映射中去。&lt;/p&gt;&lt;p&gt;在执行完上面的语句后，我们再运行下面的语句：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;db.GetTable&amp;lt;MyEmployee&amp;gt;().ToArray(); &lt;br/&gt;&lt;/div&gt;&lt;p&gt;生成的 SQL ：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: AccessDbProvider Model: Access AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;但是如果一开始就执行上面的语句，结果将如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;EMPTY&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;t0&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: AccessDbProvider Model: Access AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;因为初始状态中，映射中没有包含任何列。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、数据的更新&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于要更新的字段，我们使用的是一个匿名类，过滤用过的索引器影射。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;MyEmployee&amp;gt;();&lt;br /&gt;table.Update(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { FirstName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; },&lt;br /&gt;             o =&amp;gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;生成的 SQL&amp;nbsp;&amp;nbsp;如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;UPDATE&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Employees&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;SET&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p0&lt;/span&gt;, &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;LastName&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; (&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;) &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; CommandType: Text&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p0: Input AnsiString (Size = 3; Prec = 0; Scale = 0) [AAA]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p1: Input AnsiString (Size = 3; Prec = 0; Scale = 0) [BBB]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; @p2: Input Int32 (Size = 0; Prec = 0; Scale = 0) [-1]&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; Context: AccessDbProvider Model: Access AttributedMetaModel Build: 3.0.2.0&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三、数据的插入&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们对数据的插入，使用的也是匿名类。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;MyEmployee&amp;gt;();&lt;br /&gt;table.Insert(o =&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { FirstName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AAA&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BBB&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; });&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;四、数据的删除&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var table = db.GetTable&amp;lt;MyEmployee&amp;gt;();&lt;br /&gt;table.Delete(o =&amp;gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)o[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2205710.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/10/10/2205710.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/09/28/2194504.html</id><title type="text">ALinq &amp;amp; ORDesigner FAQ &amp;amp; ALinq3 （Beta）下载</title><summary type="text">产品下载ALinq3 免费版for NET4 下载 (免费版，对于一个数据库仅允许 18 个表，无时间或其它限制）注：仅供预览测试使用，API 在正式版可能还会有所变动。１、使用 ORDesigner 无法生成代码选择当前的 *.admf 文件，在属性窗口中，请确认 Custom Tool 的属性为 ALinqCodeGenerator 。如果该项为空白，请手动输入 ALinqCodeGenerator 。请留言 Error List 窗口提示的错误，然后再报告该错误。如下图所示：２、如何保持表名，字段名称不变？答：选择菜单 Tools -&gt; Options -&gt;ORDesigne</summary><published>2011-09-28T07:49:00Z</published><updated>2011-09-28T07:49:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/09/28/2194504.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/09/28/2194504.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;产品下载&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://download.alinq.org/ALinq_V3.0.0_FreeEdition_NET4.msi"&gt;&lt;span style="font-size: 16px;"&gt;ALinq3 免费版&amp;nbsp;for NET4 下载&lt;/span&gt;&lt;/a&gt; (免费版，对于一个数据库仅允许 18 个表，无时间或其它限制）&lt;/p&gt;&lt;p&gt;注：仅供预览测试使用，API 在正式版可能还会有所变动。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;１、使用 ORDesigner 无法生成代码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;选择当前的 *.admf 文件，在属性窗口中，请确认 Custom Tool 的属性为 ALinqCodeGenerator 。如果该项为空白，请手动输入 ALinqCodeGenerator 。&lt;/p&gt;&lt;p&gt;请留言 Error List 窗口提示的错误，然后再报告该错误。&lt;/p&gt;&lt;p&gt;如下图所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/24769/2011021618314424.jpg" alt="" width="819" height="620" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;２、如何保持表名，字段名称不变？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;答：选择菜单 Tools -&amp;gt; Options -&amp;gt;&amp;nbsp;ORDesigner ，将 Remove Underscores 设为 false 即可。这个功能主要将字段中的下划线移除，例如：&lt;/p&gt;&lt;p&gt;USER_NAME　将变为 UserName 。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/24769/2011040615140340.jpg" alt="" width="782" height="577" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;３、连接 Oracle 数据库时，出现如下错误：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/24769/2011092816040230.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;答：你需要安装 Oracle 客户端，请到 Oracle 官方网址下载安装。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;４、我已经正确引用了使用 ALinq 所需要的 dll ，但是在编译时，出现&amp;ldquo;找不到类型或命名空间名称&amp;rdquo;的错误。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;答：请将编译选项中的 Target Framework 设为 .NET Framework 3.5 或 .NET Framework 4.0 。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/24769/2011092816382577.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;５、在 win7 下安装失败&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;答：以管理员身份进行安装&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6、我使用的是免费版，为什么会抛出 LicenseException 的错误？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;答：请仔细检查一下所引用的 ALinq dll (所有以 ALinq 开头的 dll)&amp;nbsp;的版本号，只有末为数字为 8 的，才是免费版本。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;７、Access 使用自增长列&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;答：如果是设计器生成代码，记得把 Auto DBGenerated 设为 True ，这是设计器的一个小 BUG，非 ALinq 的 BUG。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/24769/2011121912342018.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2194504.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/09/28/2194504.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/09/22/2185084.html</id><title type="text">中国的土壤真的不适合软件生长！</title><summary type="text">前段时间，在博客园里看到这么一篇文章，难道中国的土壤真的不适合软件生长？如果这里说的软件，是指通用的单机软件，并且是使用光明磊落的手段销售的，那么我可以很悲观地说，没有！我想结合自身的一些情况，谈谈国内做软件的艰难。 哥从事通用软件的开发以及销售，时至今天已经三年多了，产品就是 ALinq 和 Visual Entity 了。虽然挣了些钱，但感觉目标却离自己越来越远。一直以来，中国制造，都意味着价...</summary><published>2011-09-22T06:32:00Z</published><updated>2011-09-22T06:32:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/09/22/2185084.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/09/22/2185084.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前段时间，在博客园里看到这么一篇文章，&lt;a href="http://www.cnblogs.com/dingdong/archive/2011/09/08/2171185.html" target="_blank"&gt;难道中国的土壤真的不适合软件生长？&lt;/a&gt;&amp;nbsp;如果这里说的软件，是指通用的单机软件，并且是使用光明磊落的手段销售的，那么我可以很悲观地说，没有！我想结合自身的一些情况，谈谈国内做软件的艰难。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 哥从事通用软件的开发以及销售，时至今天已经三年多了，产品就是 ALinq 和 Visual Entity 了。虽然挣了些钱，但感觉目标却离自己越来越远。一直以来，中国制造，都意味着价廉，品质低下。我想通过自己的努力，打造一款品质优良的软件，来证明中国人的能力，只要用心，我们一样可以做出好软件。然后，成立一个 Team，把中国的软件卖到全世界去。前面的已经做到了，但后面的却遥遥无期。一个原因是自己适应不了国内的商业规则，另外一个原因是中国的软件环境真的很不好。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前段时间，我在微博上发了一条求职信息，很多朋友、用户都很惊讶，对我说&amp;ldquo;以你的能力，应该自己开公司才对，我们公司一产品，不怎么样，都能养活几十人&amp;rdquo;，我听了，很无语，也很难受。这也许就是商业的残酷，适者生存，而不是理想生存，不是有这么一句话，&amp;ldquo;理想很丰满，现实很骨感&amp;rdquo;！正如有一篇文章谈创新精神，说乔布斯之所以不会在中国出现，是因为在中国的商业环境下，乔布斯生存不了。同样，中国没有真正意义的通用软件，是因为中国没有通用软件的市场。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt;这里的&amp;ldquo;真正意义的通用软件&amp;rdquo;，指的是那些不是以项目来骗取经费的软件。&amp;ldquo;没有&amp;rdquo;是指相比其它类型的软件，少得可以忽略不计。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 市场是不相信眼泪的，任何一家公司之所以发展、壮大，不是因为它们的产品有多么地伟大、多么地有技术含量，而是因为顺应了中国的商业环境。而通用软件的梦想，往往被市场无情地粉碎。在碰碰撞撞这三年中，渐渐地接触、了解国内的商业规则，大慨有以下几点：&lt;/p&gt;&lt;p&gt;1、免费为诱&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个世界上有免费的午餐吗？如果相信，你就输了。免费的东西，才是最贵的，免费不过是一个诱饵，一旦你上勾，将会付出更大的成本，商家会用尽各种方法，手段从你口袋掏钱，让付不起钱的，玩不下去，而不是去创造一个公平、合理的环境，使得整个社会的商业良性发展。例如现在的 B2C，假货横行，货不对版，低价诱骗。这种赢利模式，让奸商生存，诚实的经营者被淘汰，让整个社会的道德进一步沦丧。还有一个专做假广告的搜索引索，还有某些免费的网游，无不是这样。&lt;/p&gt;&lt;p&gt;2、恶意欺诈&amp;nbsp;&lt;/p&gt;&lt;p&gt;在国内，违法成本太低了，尤其对于大公司来说。在国内做生意，不欺骗这生意就没法做了，必须想法设法忽悠客户多花钱。就象医生忽悠病人、老师忽悠学生、官老爷忽悠屁民。整个社会都在骗。所以，你可以看得到，很多企业宁愿把钱砸在广告，然后产品的生产成本一压再压，最后不惜以劣充好。&lt;/p&gt;&lt;p&gt;3、压榨同胞&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;这种例子太多了，从制造业到软件外包行业，无不是这样，透支着劳动者的身体健康，肆意践踏劳动者的尊严。出来了人命，花大笔的钱打发官老爷，然后花个十万八万打发被自杀者的家人。&lt;/p&gt;&lt;p&gt;这些就是这个社会商业规则，任何一家企业要发展，要壮大，都要适应这些规则。更多的例子请诸位补充。&lt;/p&gt;&lt;p&gt;有通过创新并发展成为大公司的吗？有没有？中国的商业环境，就是这样，我做软件，上面任意一条规律都没有满足，只是单纯地想为客户提供价值，然后获取合理的利润，但是这种方法太难了，最起码国内是行不通的。&lt;/p&gt;&lt;p&gt;除了自身不适应上面那些商业因素，还有市场因素，按市场来划分，可以简单分为国内市场和国外市场。&lt;/p&gt;&lt;p&gt;国内市场的困境：&lt;/p&gt;&lt;p&gt;1、国内开公司的税费非常重，重得难以负荷。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 税费之重，一定程度上，不是鼓励创业，而是在扼杀创业。理论上是有税收上的优惠政策，但是谁不知道国内的潜则规呀，作为小小创业者，根本不可能有那么多时间、精力花在和政府打交道上面。税费，再加上办公费用，对于创业者来说，是笔不菲的费用。如果省下来，完全够生活了，只是，永远做不大。有时候在&lt;strong&gt;幻想&lt;/strong&gt;，如果哪天中国也可以象美国那样，可以在车库里开公司，我想，中国一定会更多有活力的小企业。&lt;/p&gt;&lt;p&gt;2、法制不健全，价值不被认同。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 曾经和一位用户在聊天的时候，谈到收费的问题，我说：&amp;ldquo;Visual Entity 暂时不考虑在国内收费&amp;rdquo;&amp;ldquo;如果收费，我就不用了。&amp;rdquo;，大概在这些用户的潜意识中，软件本来就该免费的吧，事实上，他们使用的软件都是免费的。同时，也没有意识到，破解、免费对于做通用软件的创业者，是毁灭性的打击。对于象微软这种大企业，是不怕的，反正他们总有办法赚回。预装操作系统，打击网吧的盗版，不就是了吗？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 国内软件，价格和价值已经完全不匹配了。一位在事业单位的老同学告诉我，他们单位采购的软件，按点收费的，每个点 60 万，每年还要交几万块钱的维护费，然后是一个县一个点。更有让全中国人民笑话的驴霸。背后的交易，用屁股都可以想得到。&lt;/p&gt;&lt;p&gt;3、盗版、破解肆无忌惮。&lt;/p&gt;&lt;p&gt;国外市场的困境：&lt;/p&gt;&lt;p&gt;1、语言沟通不便&amp;nbsp;&lt;/p&gt;&lt;p&gt;2、推广渠道不畅顺&lt;/p&gt;&lt;p&gt;3、品牌知名度低&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但总的来说，国外的市场环境，还是要比国内的好得多。起码，我大部份的收入，还是来自国外用户的。但是，想要想做大，已经超出我的能力范围。我需要团队，也需要时间去适应这个社会。我想，找份工作的也许会是个转折点，别了，我的共享生涯。&lt;/p&gt;&lt;p&gt;最后，以一句话来纪念仍旧正直、善良、甚至还有点纯真的自己，&amp;ldquo;如果有一天我变成了流氓，请记得我曾经纯真过&amp;rdquo;。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2185084.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/09/22/2185084.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/09/21/2184528.html</id><title type="text">Visual Entity 手册（五）添加、删除属性</title><summary type="text">Scalar Properties选择实体类，然后再按 Insert 键即可添加 Scalar Property 。选择相应的属性，再按 Delete 键即可删除。Navigation PropertiesNavigation Property 是在添加链接时候，自动创建的。在链接起端的生成的属性，例如上图 Category 实体类中的属性，允许删除。对于链接未端的属性，不允许删除（截至 1.7.4 版本，未来版本会修正）。</summary><published>2011-09-21T14:40:00Z</published><updated>2011-09-21T14:40:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/09/21/2184528.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/09/21/2184528.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Scalar Properties&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/24769/2011092122291036.jpg" /&gt;&lt;/p&gt;&lt;p&gt;选择实体类，然后再按 Insert 键即可添加 Scalar Property 。&lt;/p&gt;&lt;p&gt;选择相应的属性，再按 Delete 键即可删除。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Navigation Properties&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Navigation Property 是在添加链接时候，自动创建的。在链接起端的生成的属性，例如上图 Category 实体类中的属性，允许删除。对于链接未端的属性，不允许删除（截至 1.7.4 版本，未来版本会修正）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2184528.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/09/21/2184528.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ansiboy/archive/2011/09/06/2169031.html</id><title type="text">jsData 使用教程</title><summary type="text">简介jsData 是一个采用 JavaScript 编写的数据组件类库，目标是将 Asp.net 中的 GridView，DetailsView，FormView 移植到 JavaScript 中来，并在原有功能的基础上进行扩展，它是为 Asp.net 开发人员而设计。其中 JData.js 文件是用来实现 Asp.Net 中的 GridView，DetailsView， FromView，（FromView 尚未完成），它是基本于 MS AJAX，在使用中需要引用 MS AJAX 。JData.DateTimeField.js，JData.GroupColumn.js …… 等文件是用于对原</summary><published>2011-09-06T09:58:00Z</published><updated>2011-09-06T09:58:00Z</updated><author><name>麦舒</name><uri>http://www.cnblogs.com/ansiboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ansiboy/archive/2011/09/06/2169031.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ansiboy/archive/2011/09/06/2169031.html"/><content type="html">&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;jsData 是一个采用 JavaScript 编写的数据组件类库，目标是将 Asp.net 中的 GridView，DetailsView，FormView 移植到 JavaScript 中来，并在原有功能的基础上进行扩展，它是为 Asp.net 开发人员而设计。&lt;br /&gt;其中 JData.js 文件是用来实现 Asp.Net 中的 GridView，DetailsView， FromView，（FromView 尚未完成），它是基本于 MS AJAX，在使用中需要引用 MS AJAX 。&lt;br /&gt;JData.DateTimeField.js，JData.GroupColumn.js &amp;hellip;&amp;hellip; 等文件是用于对原有的功能进行扩展，部份类库需要引用到 JQuery，以及 JQuery UI，具体请查看该文件中的注释以及相关的实例。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_1" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/06/26/1765731.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（－） 加载数据&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_0" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/06/27/1766028.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（二） 对显示的数据进行格式化&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_9" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/06/27/1766279.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（三） 实现增删改功能&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_8" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/06/28/1766806.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（四） 对输入数据进行验证（客户端验证）&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_7" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/06/29/1767216.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（五） 对输入数据进行验证（服务端验证）&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_6" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/06/29/1767761.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（六） 对数据进行排序&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_5" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/06/30/1768001.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（七） 过滤数据&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_4" class="PostTitle" href="http://www.cnblogs.com/ansiboy/archive/2010/07/19/1780558.html"&gt;&lt;span style="color: #6699cc;" color="#6699cc"&gt;jsData 使用教程（八） 使用 TreeColumn 实现 TreeGrid&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ansiboy/aggbug/2169031.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ansiboy/archive/2011/09/06/2169031.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
