下面是一個簡單linq
查詢我在實體框架執行實體框架 - 潛在的SQL語句
db.Responses.FirstOrDefault(r => r.QuestionId.Equals(「1.1.1」) && r.User.Id.Equals(user.Id) && !r.IsDeleted);
這裏QuestionId
是varchar
數據類型列,db是上下文對象。
我解僱了實體Profiler來看看發生了什麼引擎蓋下面的SQL查詢下發生的事情似乎有一堆語句似乎有點畫蛇添足
/* 1 */ SELECT TOP (1) *
/* 2 */ FROM [dbo].[Responses] AS [Extent1]
/* 3 */ WHERE ((([Extent1].[QuestionId] = '1.1.1' /* @p__linq__0 */)
/* 4 */ AND (NOT ([Extent1].[QuestionId] IS NULL
/* 5 */ OR '1.1.1' /* @p__linq__0 */ IS NULL)))
/* 6 */ OR (([Extent1].[QuestionId] IS NULL)
/* 7 */ AND ('1.1.1' /* @p__linq__0 */ IS NULL)))
/* 8 */ AND ([Extent1].[UserId] = 1 /* @p__linq__1 */)
/* 9 */ AND (1 /* @p__linq__1 */ IS NOT NULL)
/* 10 */ AND ([Extent1].[IsDeleted] <> cast(1 as bit))
通知所有額外的代碼行4-7 ,改變QuestionId
不null
簡化了查詢作爲這樣
/* 1 */ SELECT TOP (1) *
/* 2 */ FROM [dbo].[Responses] AS [Extent1]
/* 3 */ WHERE ([Extent1].[QuestionId] = '1.1.1' /* @p__linq__0 */)
/* 4 */ AND ('1.1.1' /* @p__linq__0 */ IS NOT NULL)
/* 5 */ AND ([Extent1].[UserId] = 1 /* @p__linq__1 */)
/* 6 */ AND (1 /* @p__linq__1 */ IS NOT NULL)
/* 7 */ AND ([Extent1].[IsDeleted] <> cast(1 as bit))
所以,問題是爲什麼不把實體框架中所有額外的代碼? 爲什麼是4號線&線6必要,在where子句中唯一的相關陳述線3,5和7,
我試圖優化我的SQL語句和爲什麼實體框架正在做的事情什麼想法方式會有所幫助。我在Visual Studio 2013中使用EF6。
如何比較值:'r.QuestionId ==「1.1.1」'? –
@WiktorZychla r.QuestionId ==「1.1.1」沒有區別,既不.Equals和「==」都是等價的,r.QuestionId ==「1.1.1」代碼保持不變。 – usr28765526