顯示我的問題,我試圖解釋一個樣本:實體框架性能VS傳統ADO.Net
假設我有一個表UsersInfo
這些列:
Id, UserName, Password, FName, LName, Gender, Birthday,
HomeTel, Mobile, Fax, Email, LockStatus
現在我想選擇LockStatus
從這張桌子。在傳統模式下,我們取得這個查詢並將其發送給SqlCommand
用於執行:
SELECT LockStatus FROM UsersInfo
今天在使用實體框架,我們使用這個來自查詢:
var q = from r in new Data_DBEntities().UsersInfo
select new
{
r.LockStatus
};
實體SQL:
SELECT UsersInfo.LockStatus
FROM Data_DBEntities.UsersInfo
現在我啓動應用程序並使用SQL Server Profiler跟蹤它。如果我用的是第一種類型的查詢(傳統模式),我看到這樣的結果:
SELECT LockStatus FROM UsersInfo
但是當我使用實體框架(LINQ ||實體SQL),在SQL Server探查表明,該結果:
SELECT
[Extent1].[LockStatus] AS [LockStatus]
FROM (SELECT
[UsersInfo].[Id] AS [Id],
[UsersInfo].[UserName] AS [UserName],
[UsersInfo].[Password] AS [Password],
[UsersInfo].[FName] AS [FName],
[UsersInfo].[LName] AS [LName],
[UsersInfo].[Gender] AS [Gender],
[UsersInfo].[Birthday] AS [Birthday],
[UsersInfo].[HomeTel] AS [HomeTel],
[UsersInfo].[Mobile] AS [Mobile],
[UsersInfo].[Fax] AS [Fax],
[UsersInfo].[Email] AS [Email],
[UsersInfo].[LockStatus] AS [LockStatus]
FROM [dbo].[UsersInfo] AS [UsersInfo]) AS [Extent1]
我們可以看到EF在後臺選擇了所有的列。
現在我的問題是:我只想選擇一列,但EF選擇所有的列。如果我的桌子上有10萬條記錄,表現會非常糟糕!
也許說使用函數或存儲過程,但是當你想在不同的表中選擇不同的列時,這不是一個好主意。
您認爲如何?有什麼辦法嗎?
你做錯了什麼。EF將查詢所有字段以生成對象 - 顯然。但是如果你在查詢中做了一個處理,那麼它就不會。 THAT說 - 這是我的幫助結束的地方,因爲我不熟悉LINQ sql語法,更喜歡我自己的函數式語法。我絕對沒有這個問題。 – TomTom
雖然我明白查詢看起來很沉重,但我發現EF(現在在v6)與傳統的ADO.NET一樣快,並且我擁有數十萬行的表 - 提供查詢被正確書寫。如果您擔心**的表現**,您是否考慮過在表現**上進行測試**? –