2013-12-07 1 views
2

Кто-нибудь знает, почему EF6 будет излишне перебрасывать Int16 в smallint? Используя функцию ведения журнала, я вижу, что выполняется следующий запрос:Entity Framework 6.0.1 ненужно литье smallint

SELECT 
    [Project1].[LabelName] AS [LabelName], Project1.Usage, Project1.FacilityID 
    FROM (SELECT 
     [Extent1].[LabelName] AS [LabelName], 
     [Extent1].[Usage] AS [Usage], 
     extent1.facilityid 
     FROM [dbo].[Label] AS [Extent1] 
     WHERE (0 = [Extent1].[DeleteInd]) 
     AND ([Extent1].[FacilityID] IN (cast(1 as smallint), cast(5 as smallint))) 
     AND (([Extent1].[LabelName] LIKE @p__linq__0 ESCAPE '~') OR ([Extent1].[LabelName] LIKE @p__linq__1 ESCAPE '~')) 
    ) AS [Project1] 
    ORDER BY [Project1].[Usage] DESC 
-- p__linq__0: '%test%' (Type = AnsiString, Size = 8000) 
-- p__linq__1: 'test%' (Type = AnsiString, Size = 8000) 
-- Executing at 12/6/2013 4:08:49 PM -08:00 
-- Completed in 16 ms with result: SqlDataReader 

Это запрос Linq:

Context.Database.Log = Console.Write; 
var labels = (from label in Context.Labels 
       where label.DeleteInd == false && 
       Settings.FacilitySearch.Contains(label.Facility.FacilityID) && 
       (label.LabelName.Contains(searchText) || label.LabelName.StartsWith(searchText)) 
       orderby label.Usage descending 
       select label.LabelName); 

return labels.ToList(); 

EF знает FacilityId является SMALLINT < -> Int16 (будет показывать картинку, но не достаточное количество очков репутации: - /)

проекта: C WinForms # .NET 4.0 для Windows 7 SP1 Visual Studio 2010

+0

Попробуйте использовать 'DataAnnotation' над свойством, например:' [Column (TypeName = "INT")] '(example) – Tico

+0

Какой тип' Settings.FacilitySearch'? – StriplingWarrior

+0

@Tico: зачем это нужно, когда отображение EF уже знает его INT16? Я использую первую разработку базы данных. – BSOD2600

ответ

1

Я предполагаю, что это преобразование не требуется в данном конкретном случае, но было проще писать код, который всегда выполняет касты, и предположить, что SQL Server, вероятно, оптимизирует его в любом случае. Вероятно, разработчики полагали, что лучше создавать ненужно сложный SQL, чем поддерживать ненужный сложный код.

+0

Да, я вижу в этом логику. Согласовано, лучше, чем разбрызгивать специфические аннотации базы данных в коде и позволить EF/SQL обрабатывать оптимизацию. – BSOD2600

+0

К сожалению, это предположение плохо, так как это приводит к серьезным плохим временам выполнения. Я тоже застрял в этом. – TomTom

+1

К сожалению, это предположение плохо, так как это приводит к серьезным плохим временам выполнения. Я тоже застрял в этом. Как вы можете видеть в http://stackoverflow.com/questions/22149456/entity-framework-ridiculous-query-casting-smallint-to-int-for-comparison, что делает выполнение с едва заметным до 5 минут, поскольку оно создает самостоятельно присоединиться к плану выполнения. – TomTom

 Смежные вопросы

  • Нет связанных вопросов^_^