【发布时间】:2011-03-19 13:47:52
【问题描述】:
受到能够在 EF 查询中使用枚举的愿望的启发,我正在考虑将 ExpressionVisitor 添加到我的存储库中,它将采用传入的条件/规范条件并重写它们以使用相应的持久化 int 属性。
我一直在我的(代码优先)实体中使用以下值后缀模式:
public class User : IEntity
{
public long ID { get; set; }
internal int MemberStatusValue { get; set; }
public MemberStatus MemberStatus
{
get { return (MemberStatus) MemberStatusValue; }
set { MemberStatusValue = (int) value; }
}
}
并使用以下方法将其映射到数据库:
internal class UserMapping : AbstractMappingProvider<User>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
// adds ToTable and other general mappings
base.DefineModel( modelBuilder );
Map.Property( e => e.MemberStatusValue ).HasColumnName( "MemberStatus" );
}
}
在我的存储库中,我有以下方法:
public IQueryable<T> Query( Expression<Func<T, bool>> filter, params string[] children )
{
if( children == null || children.Length == 0 )
{
return Objects.Where( filter );
}
DbQuery<T> query = children.Aggregate<string, DbQuery<T>>( Objects, ( current, child ) => current.Include( child ) );
return filter != null ? query.Where( filter ) : query;
}
我想在此方法中添加一个方法调用来重写过滤器表达式,将所有对 MemberStatus 属性的引用替换为对 MemberStatusValue 的引用。
我想这将是一个涉及类似 in this SO post 的解决方案,但我不确定如何从构思到实施。
如果您能就添加此功能的潜在性能影响提供任何建议,我们将不胜感激。
【问题讨论】:
-
看看这个帖子:bit.ly/eUOi08
-
谢谢,看起来完全正确.. 将调查!
-
另请注意,最新版本的 EF(六月 CTP)已原生支持枚举 - 下一个正式版本 (4.2) 将使其正式 - blogs.msdn.com/b/adonet/archive/2011/06/30/…
-
成功了吗?是否应将以上任何内容写成答案并接受?
-
是的,但我不会在这里发布代码。此外,EF 现在支持枚举(它只是等待正式的 4.5 框架发布)。
标签: c# entity-framework reflection expression-trees entity-framework-4.1