2010-07-28 26 views
6

我正在比較EF和輸入的數據集的用處。如果只將EF綁定到SQL Server,我不明白爲什麼要使用EF over typed數據集。但是,它確實在EF LINQ的語句在尊重已故評價,如果你不喜歡的東西:有人可以澄清實體框架和類型化數據集之間的關鍵區別嗎?

db.Customers.where(c => c.Name == "John Smith") 

的EF將建立類似的查詢:

select * from Customers where Name = 'John smith' 

但與類型化數據集你可以寫:

bll.GetCustomers().where(c => c.Name == "John Smith") 

這是非常相似,但不同的是它第一次運行:

select * from Customers 

然後使用標準集合庫查找包含Name:「John Smith」的行。從理論上講,EF將會更有效率。

這是正確的嗎?

+0

一個很簡單的問題,說明一個可能不會立即明顯的問題。 – 2010-07-31 21:14:09

+0

EF - 良好,輸入數據集 - Blaaaaah。 – zmbq 2013-01-05 18:49:45

回答

4

是的。使用實體框架,它使用IQueryable<T>來構建您的查詢。在做:

var results = db.Customers.Where(c => c.Name == "John Smith"); 

在內部,結果將是IQueryable<Customer>(或您的類型)。這允許提供者(EF)優化內部執行的方式。在SQL Server的情況下,發送到服務器的實際查詢將已經存在SQL WHERE子句,這反過來意味着您將只從數據庫返回單個記錄(如果「名稱」是唯一的)的每一條記錄。

使用類型化數據集,您將返回每條記錄,然後搜索結果以查找適當的名稱。這可能效率更低。

+0

太棒了,這只是我正在尋找的那種答案:)現在來研究一下,我是使用EF作爲數據訪問層,還是將其與另一層抽象出來......我有點像在我的業務邏輯層中使用Linq。 (但這可能是後面的問題) 謝謝! – 2010-07-28 23:19:20

2

這是正確的。實體框架是一個對象關係映射器(ORM)。它提供了一種將對象映射到查詢的關係數據的方法。 IQueryable<T>與EF一起使用,可以基本上優化發送到服務器和從服務器發送的SQL。

1

不,這是不正確的。使用類型化數據集,您可以向表適配器添加參數查詢,例如'SELECT * from Customers where name = @name' 您將在運行時從您的代碼中提供name參數。這樣你只會將你想要的數據拖入數據集。根據Reed的回覆首先拉整個表格,對於任何規模的數據庫來說,效果都不是很好,而且不太現實。 這似乎是ADO.Net常見的誤解,甚至在一些書中延續 - 特別是關於實體框架的書!

相關問題