技术开发 频道

浅谈Linq To Sql集成数据库语言的优劣


  2、Linq To Sql的缺点

  很久前,有个网友问到这么一个问题。他在界面上有个DataView,里面绑定了一些Column,然后他勾选那一列就按某列排序。其传回的参数是列的名字。然后问我该怎么用Dlinq 来实现。

  在以前拼接Sql语句的年代,这个很简单,一个" order by " + string,想按什么排就按什么来排。而现在dlinq是用是一个对象的属性,已经不可能拼接了。我当时给他的答案是这样的。

  以下是引用片段:
private void Methods(string orderId)   {    var q = db.Customers.Select(c=>c);       switch(orderId)    {    case "ID":    q = q.OrderBy(c=>c.ID);    break;    case "Name":    q = q.OrderBy(c=>c.Name);    break;    default:    break;    }       var result = q.ToList();   }

 

  我那时也没有想出一个更好的方案来。而后告诉他去查下Compiled Query,说不定可以找到更方便的。后来我才在这个例子中,看到更方便的。

  以下是引用片段:

var query =    db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).    OrderBy("CompanyName").    Select("New(CompanyName as Name, Phone)");

  在这里OrderBy直接接收的就是列的名字。再仔细一看,好像Where里是Linq的语句哎,那OrderBy也该是linq语句。后来,我把CompanyName换成小写的,一跑过了。莫非真的是列的名字?出个难题吧。找了一个列名,是带空格的,重新来建这个工程.一跑,错了!把列名用中国扩号扩起来了,也是错了。咳,只是动态构造Expression Tree而已,永远都不能直接接收列的名字。这个例子看着是很简单,可不知道你有没有注意到它有一个80多k的Dynamic.cs文件。更有意思的事情是,它的名称空间是System.Linq.Dynamic.看样子,ms本来是打算把它加在.net3.5中吗.不晓得为什么放到了例子中了。这个名称空间下,其主要内容就是动态构造Expression Tree. 和Linq To Sql进阶系列(七)动态查询一文中的方法类似。只是,它还包含了解析字符串部分.

  从上面那个例子中,可以看出,Linq To Sql在这种动态构造语句时,比拼接sql麻烦很多。在Linq To Sql进阶系列(七)动态查询一文中,笔者极力推荐使用object的查询。这符合Linq To Sql的设计原则。因为,它主要是为了解决data!=objects 的问题而产生的.它所有的操作均针对object,那就让我们使用object的查询吧.

  当然,依然会有人习惯拼接字符串.我并不认为这是个坏毛病。只是有点不符合oo思想而已。事实上,在Linq To Sql中,你依然可以使用拼接字符串的形式,而不使用它提供的Query Expression. 它提供了这么两个接口,一个是,db.ExecuteQuery(string sql); 另一个是,db.ExecuteCommand(string sql); 这两个函数都是直接接收 sql语句的.习惯拼接的人,依然可以调用它们来实现你的程序。特别是第一个,其返回的就是一个对象的集合,多少还是有点oo思想的。

  看下面的例子:

  以下是引用片段:

var products = db.ExecuteQuery(    "SELECT [Product List].ProductID, [Product List].ProductName " +    "FROM Products AS [Product List] " +    "WHERE [Product List].Discontinued = 0 " +    "ORDER BY [Product List].ProductName; "    ).ToList();
  它返回的就是product的集合。而不是什么dataset和datatable之类的。这里,你可以大胆的使用该函数继续拼接你的sql吧,再看下面这个:

  以下是引用片段:
db.ExecuteCommand("UPDATE Products SET UnitPrice = UnitPrice + 1.00");
  它在做批处理的时候,你想不用它,都不行.当然,你如果觉得性能不是问题的话,那就用submitchange方法来做更新好了。简单明了的说, Linq To Sql在批处理更新的时候,SubmitChange只会一个个的更新。浪费时间资源.而这个接口,恰好满足了批处理更新或删除的问题。从这两个例子,我们可以看出。没有任何方案是功能较多的。各有各的优点。
0
相关文章