我有這樣的代碼:爲什麼實體框架生成緩慢的過度工程SQL?
DbSet<TableName> table = ...// stored reference
var items = from n in table where
n.Name.ToUpper().Contains(searchString.ToUpper().Trim())
select n;
WriteToLog(items.ToString());
最後一行輸出所生成的SQL。下面是我得到:
SELECT
[Extent1].[Name] AS [Name],
// all the other columns follow
FROM (SELECT
[TableName].[Name] AS [Name],
// all the other columns follow
FROM [dbo].[TableName] AS [TableName]) AS [Extent1]
WHERE (CAST(CHARINDEX(LTRIM(RTRIM(UPPER(@p__linq__0))), UPPER([Extent1].[Name])) AS int)) > 0
你看,有SELECT
-from- SELECT
雖然它完全是多餘的 - 一個SELECT
就剛好夠。使用EF的代碼運行超過半分鐘,並在該查詢超時,但表格很小。
爲什麼這個過度工程化的SQL查詢生成了,我該如何讓EF生成一個更好的查詢?
查詢優化器將對此做簡短的工作。我認爲它會生成不可讀的代碼,但這不是問題,因爲它不是爲了實現這個目的而設計的。如果你有一些測量的證據表明SQL很慢,那會很好,但我會想象它不是,而你錯了。你做? –
至於如何改善它,請參閱http://weblogs.asp.net/scottgu/archive/2012/07/19/entity-framework-and-open-source.aspx –
@Kieren Johnstone:好的,查詢運行時間超過半分鐘,並超時,雖然它相當微不足道。 – sharptooth