[英]Entity Framework using SQL_VARIANT
在下面的示例中,我在INT字段上查詢實體。 以下是我的情況的示例:
int test =1;
var listExample= _db.EntityTable.Where(x => x.StatusId == test).ToList();
當我查看生成的SQL時,它使用SQL_VARIANT作為變量聲明,因此未在表上正確使用索引,從而導致整個表掃描。
下面是生成的SQL的示例:
DECLARE @p__linq__0 AS SQL_VARIANT;
SET @p__linq__0 = NULL;
SELECT
[Extent1].[id] AS [id],
FROM [dbo].[tbl_table_example] AS [Extent1]
WHERE [Extent1].[status_id] = @p__linq__0
無論如何,有沒有讓EF嘗試將變量定義為查詢的屬性類型?
我認為這只是Visual Studio IntelliTrace生成與實際執行的SqlCommand相對應的SQL批處理方式的錯誤或限制。 我復制了此內容,但查看了通過SQL事件探查器發送的SQL,它看起來是正確的:
exec sp_executesql N'SELECT [x].[Id], [x].[StatusId]
FROM [EntityTable] AS [x]
WHERE [x].[StatusId] = @__test_0',N'@__test_0 int',@__test_0=1
EF日志記錄還會報告正確的參數類型:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[StatusId] AS [StatusId]
FROM [dbo].[EntityTables] AS [Extent1]
WHERE [Extent1].[StatusId] = @p__linq__0
-- p__linq__0: '1' (Type = Int32, IsNullable = false)
-- Executing at 8/1/2018 9:41:32 AM -05:00
-- Completed in 20 ms with result: SqlDataReader
而IntlliTrace輸出(請注意第一行的警告)是:
--Type and value data was not available for the following variables. Their values have been set to defaults.
DECLARE @p__linq__0 AS SQL_VARIANT;
SET @p__linq__0 = NULL;
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[StatusId] AS [StatusId]
FROM [dbo].[EntityTables] AS [Extent1]
WHERE [Extent1].[StatusId] = @p__linq__0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.