1

我在查询中遇到了一些性能瓶颈。每当我在我的实体中引入属性作为字节时,会发生什么情况,EF 4.1在处理它之前将其转换为int。给定的代码将解释:EF 4.1 SQL Compact字节

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行的第一天,其节省空间(虽然幸运的是不是必要的),它的国家领域只占用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); 
     } 
    } 
} 
+0

你可以发布'StateValue和'SegmentState'类型吗?如果你正在处理大量的数据,那么我不认为SQL CE能够处理它们 – Eranga 2011-06-10 23:17:15

回答

0

严重不使用EF - 这将是你人生最大的痛苦。 看看C#中的MASSIVE和Dynamics - 它会打开你的眼睛终生;-)

+0

啊哈,回答我不喜欢听到;)我只是换了一个简单的旧的Sql DB层为一个整洁的EF 4.1层。尽管存在一些问题(比如这个问题),但它在很多方面都非常出色。幸运的是,我总是可以回到EF中普通的旧SQL查询(但不是)。 – Polity 2011-06-10 21:37:42

+0

大规模也很棒,但它有缺点,我不喜欢动态时,我真的不需要。我选择.NET和C#的原因,我想坚持, – Polity 2011-06-10 21:39:29

+0

只要你不瞄准性能EF可能是一个选项;-) – 2011-06-10 21:39:45