【发布时间】:2011-06-10 21:14:50
【问题描述】:
我的查询遇到了一些性能瓶颈。当我在实体中将属性作为字节引入时,会发生什么情况,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);
}
}
}
【问题讨论】:
-
你能发布
StateValue andSegmentState`的类型吗?如果您正在处理大量数据,那么我认为 SQL CE 无法处理它们
标签: c# .net entity-framework entity-framework-4 sql-server-ce-4