EF 4.1 SQL Compact byte - PullRequest
       25

EF 4.1 SQL Compact byte

1 голос
/ 11 июня 2011

У меня несколько проблем с производительностью в моих запросах. Что происходит, когда я представляю свойство в виде байта в моей сущности, 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

Так как эта таблица может содержать более 100 000 строк в день, ее эффективное пространство (хотя, к счастью, несущественное) для ее поля 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);
        }
    }
}

1 Ответ

0 голосов
/ 11 июня 2011

Серьезно, не используйте EF - это будет самая большая боль в вашей жизни.Взгляните на MASSIVE и Dynamics в C # - это откроет вам глаза на всю жизнь; -)

...