EF 4.1 SQL Compact byte

本文关键字:Compact byte SQL EF | 更新日期: 2023-09-27 17:58:49

我的查询遇到了一些性能瓶颈。每当我在实体中引入一个属性作为字节时,EF 4.1就会在使用它之前将其强制转换为int

var segmentQuery = workUnit.SegmentRepository.GetQuery()
                                             .Where(x => x.FileId == file.Id)
                                             .Where(x => x.StateValue == (byte)SegmentState.Unhandeled)
                                             .OrderBy(x => x.Index);

很好地翻译为:

SELECT 
....
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
    ...
    [Extent1].[StateValue] AS [StateValue]
    FROM [Segments] AS [Extent1]
    WHERE ([Extent1].[FileId] = @p__linq__0) AND (0 = [Extent1].[StateValue])
)  AS [Project1]
ORDER BY [Project1].[Index] ASC

然而,在上面的例子中:StateValue实际上是一个整数,这对于我的需求(4种不同的状态)来说太多了,但当将其更改为字节时,我得到:

SELECT ...
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
      ...
    [Extent1].[StateValue] AS [StateValue]
    FROM [Segments] AS [Extent1]
    WHERE ([Extent1].[FileId] = @p__linq__0) AND (0 = ( CAST( [Extent1].[StateValue] AS int)))
)  AS [Project1]
ORDER BY [Project1].[Index] ASC

由于该表一天可能包含超过100000行,因此State字段只占用1个字节是节省空间的(尽管幸运的是不是必需的),但是,更改为字节会扼杀我的查询。

我做错什么了吗?我能做什么吗?这个"问题"已知吗?

谢谢!

**更新**

[Flags]
public enum SegmentState : byte
{
    Unhandeled,
    Downloaded,
    Invalid,
    Assembled
}

在我的实体中:

/// <summary>
/// Dont use this, use SegmentState instead
/// </summary>
[Required]
public byte StateValue
{
    get { return _stateValue; }
    set { _stateValue = value; }
}
public SegmentState State
{
    get { return (SegmentState)StateValue; }
    set 
    {
        if (State != value)
        {
            StateValue = (byte)value;
            RaisePropertyChanged(StatePropertyName);
        }
    }
}

EF 4.1 SQL Compact byte

说真的不要使用EF——这将是你一生中最大的痛苦。看看C#中的MASSIVE和Dynamics,它会让你大开眼界;-)