首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何重写查询表达式以将枚举替换为整数?

如何重写查询表达式以将枚举替换为整数?
EN

Stack Overflow用户
提问于 2011-03-19 21:47:53
回答 1查看 1.5K关注 0票数 17

受能够在EF查询中使用枚举的愿望的启发,我正在考虑向我的存储库添加一个ExpressionVisitor,它将接受传入的标准/规范标准,并重写它们以使用相应的持久化整型属性。

我一直在我的(代码优先)实体中使用以下值后缀模式:

代码语言:javascript
复制
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; }
    }
}

并使用以下命令将其映射到数据库:

代码语言:javascript
复制
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" );
    }
}

在我的存储库中,我有以下方法:

代码语言:javascript
复制
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的引用。

我认为这将是一个涉及seen in this SO post之类的解决方案,但我不确定如何从想法到实现。

如果您能就添加此功能的潜在性能影响提供任何建议,也将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2012-06-08 20:59:42

我不确定这是否是您想要的,但我发现以类似但略有不同的方式处理枚举会更简单。也就是说,我和您一样有两个属性,但是我的int属性是公共的,并且是数据库持久化的属性;然后我有另一个公共“包装器”属性,它通过对所需的枚举类型进行强制转换来获取/设置int属性值,而这正是应用程序的其余部分实际使用的类型。

因此,我不必纠结于模型;EF可以很好地理解和持久化int属性,而应用程序的其余部分则可以很好地与枚举类型进行交互。关于我的方法,我唯一不喜欢的是,我必须在我试图查询的任何枚举值上使用一堆强制转换来编写LINQ语句,以便将其转换为一个int,以便与实际持久化的字段进行匹配。然而,这是一个很小的代价,我想向你推荐它,因为在我看来,你正在使用一个字符串来生成你的查询,这放弃了LINQ提供的所有类型安全,智能感知等。

最后,如果您对如何使用EF 5中的新枚举功能感兴趣(如果您想尝试一下,现在可以下载测试版),请查看以下内容:

http://msdn.microsoft.com/en-us/hh859576

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5362468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档