Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6.0.1不必要地强制转换smallint_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架6.0.1不必要地强制转换smallint

C# 实体框架6.0.1不必要地强制转换smallint,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,有人知道为什么EF6会不必要地将Int16重新转换为smallint吗?使用日志功能,我看到它执行了以下查询: SELECT [Project1].[LabelName] AS [LabelName], Project1.Usage, Project1.FacilityID FROM ( SELECT [Extent1].[LabelName] AS [LabelName], [Extent1].[Usage] AS [Usage],

有人知道为什么EF6会不必要地将Int16重新转换为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 Windows7SP1
Visual Studio 2010

我猜在这种特殊情况下不需要这种转换,但编写始终执行强制转换的代码更简单,并且假设SQL Server可能会对其进行优化。开发人员可能认为生成不必要的复杂SQL比维护不必要的复杂代码要好。

尝试在属性上方使用
DataAnnotation
,例如:
[Column(TypeName=“INT”)]
(示例)
设置的类型是什么。FacilitySearch
?@Tico:当EF映射已经知道它是INT16时,为什么需要这样做?我使用的是数据库优先开发。@StriplingWarrior:这是一个:
ReadOnlyCollectionFacilitySearch
@BSOD2600我明白你的意思。但是代码首先要做的就是为您创建数据库。除非你知道幕后发生了什么,否则就强迫你做些事情。我不是一个好的程序员,但我会假设转换是为了使数据库更小,所以。但我一直在使用CF,我从来没有见过这个。奇怪。是的,我能看出其中的逻辑。同意,这比在代码中添加特定于数据库的注释并让EF/SQL处理优化要好。遗憾的是,这种假设是错误的,因为这会导致一些严重的执行时间错误。不幸的是,这个假设是错误的,因为这会导致一些严重的执行时间错误。我现在也被这个问题困扰着。正如您在中所看到的,它将执行时间从难以测量缩短到5分钟,因为它在执行计划中创建了一个自连接。