2010-09-04 38 views
0

假設我使用Linq to Sql概念與C#語言中的數據庫進行交互,那麼我可能面臨哪些挑戰?意味着在架構,性能,類型安全,對象定位等方面。Linq在點網絡中對SQL概念的挑戰

+0

http://freekleemhuis.com/2008/03/26/linq-to-sql-problems/ – 2010-09-04 13:45:42

回答

1

基本上Linq to SQL爲您的數據庫中的每個表生成一個類,並使用關係屬性和全部屬性完成,因此您將不會遇到類型安全性問題。使用C#partials允許您爲這些對象添加功能,而不會混淆Linq to SQL自動生成的代碼。它工作得很好。因爲表格直接映射到類和對象,所以要麼必須接受域層直接鏡像數據庫設計,要麼必須在Linq to SQL之上構建某種形式的抽象層。對於多對多關係,表格的直接鏡像可能會非常麻煩,但不直接支持 - 而不是Orders.Products,您會得到Order.OrderDetails.SelectMany(od => od.Product)

與大多數其他ORM不同,Linq to SQL不僅僅分配數據庫中的對象,還允許您通過將對象傳遞迴ORM來存儲或更新對象。相反,Linq to SQL會跟蹤從數據庫加載的對象的狀態,並允許您更改已保存的狀態。這很難解釋和理解奇怪 - 我建議你閱讀一些有關這個問題的瑞克斯特拉斯博客。

性能明智Linq-to-SQL的確很不錯。在基準測試中,它顯示的速度大約是原生SQL讀取器提供的速度的90-95%,而且根據我的經驗,真實世界的使用速度也非常快。像所有ORM一樣,Linq to SQL受N + 1選擇問題影響,但它提供了根據上下文指定延遲/加載的好方法。

此外,通過選擇Linq to SQL,您可以選擇MSSQL - 確實存在允許您連接到其他數據庫的第三方解決方案,但上次檢查時沒有一個顯示非常完整。總而言之,Linq to SQL是一個很好的,有點容易學習的ORM,它可以很好的執行。如果您需要的功能超出了Linq to SQL提供的功能,請查看新的實體框架 - 它具有更多功能,但也更復雜。

1

我們遇到了一些挑戰,主要是向不瞭解數據庫如何工作的程序員打開查詢構建功能。這裏有一些氣味:

//bad scaling 
//Query in a loop - causes n roundtrips 
// when c roundtrips could have been performed. 
List<OrderDetail> od = new List<OrderDetail>(); 
foreach(Customer cust in customers) 
{ 
    foreach(Order o in cust.Orders) 
    { 
    od.AddRange(dc.OrderDetails.Where(x => x.OrderId = o.OrderId)); 
    } 
} 

//no seperation of 
// operations intended for execution in the database 
// from operations intended to be executed locally 
var query = 
    from c in dc.Customers 
    where c.City.StartsWith(textBox1.Text) 
    where DateTime.Parse(textBox2.Text) <= c.SignUpDate 
    from o in c.Orders 
    where o.OrderCode == Enum.Parse(OrderCodes.Complete) 
    select o; 

//not understanding when results are pulled into memory 
// causing a full table load 
List<Item> result = dc.Items.ToList().Skip(100).Take(20).ToList(); 

另一個問題是,從表結構分離的一個多層次意味着索引甚至容易被忽視(這是與任何ORM的問題雖然)。