- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
受到能够在 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 的解决方案,但我不确定如何从想法到实现。
如果您能就添加此功能对性能的潜在影响提出任何建议,我们也将不胜感激。
最佳答案
我不确定这是否正是您所追求的,但我发现以类似但略有不同的方式处理枚举更简单。也就是说,我有两个属性,就像你一样,但我的 int 属性是公共(public)的,并且是数据库持久存在的;然后我有另一个公共(public)“包装器”属性,它通过从/到所需枚举类型的转换获取/设置 int 属性值,这是应用程序其余部分实际使用的类型。
因此,我不必在模型上乱搞; EF 很好地理解并保留了 int 属性,而应用程序的其余部分则与枚举类型进行了良好的交互。关于我的方法,我唯一不喜欢的是我必须在我尝试查询的任何枚举值上使用一堆强制转换来编写我的 LINQ 语句,以将其转换为 int 以匹配实际保留的字段。然而,这是一个很小的代价,我想向你推荐它,因为在我看来你正在使用一个字符串来生成你的查询,它放弃了 LINQ 提供的所有类型安全、Intellisense 等。
最后,如果您对如何使用 EF 5 中的新枚举功能感兴趣(如果您想试用,现在可以下载 Beta 版),请查看:
关于c# - 如何重写查询表达式以用整数替换枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5362468/
我是一名优秀的程序员,十分优秀!