Mor*_*ner 17 c# reflection entity-framework expression-trees entity-framework-4.1
受到希望能够在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; }
}
}
Run Code Online (Sandbox Code Playgroud)
并使用以下内容将其映射到数据库:
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" );
}
}
Run Code Online (Sandbox Code Playgroud)
在我的存储库中,我有以下方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
我想在此方法中添加一个方法调用来重写过滤器表达式,用对MemberStatusValue的引用替换对MemberStatus属性的所有引用.
我想这将是一个涉及在这篇SO帖子中看到的东西的解决方案,但我不确定如何从想法到实现.
如果您可以就添加此功能可能对性能产生影响提供任何建议,那么也将不胜感激.
我不确定这是否正是您所追求的,但我发现以类似但略有不同的方式处理枚举更简单。也就是说,我有两个属性,就像你一样,但我的 int 属性是公共的,并且是数据库持久化的;然后,我有另一个公共“包装器”属性,它通过从/到所需枚举类型的转换来获取/设置 int 属性值,这是应用程序的其余部分实际使用的。
因此,我不必摆弄模型;EF 可以很好地理解并保留 int 属性,而应用程序的其余部分可以与枚举类型进行良好的交互。我对我的方法唯一不喜欢的是,我必须编写 LINQ 语句,并对我试图查询的任何枚举值进行大量强制转换,以将其转换为 int 以与实际保留的字段进行匹配。然而,这是一个很小的代价,我想向您建议它,因为在我看来,您正在使用字符串来生成查询,这放弃了 LINQ 提供的所有类型安全、智能感知等。
最后,如果您对如何使用 EF 5 中的新枚举功能(如果您想尝试的话,现在可以下载测试版)感兴趣,请查看以下内容:
http://msdn.microsoft.com/en-us/hh859576
| 归档时间: |
|
| 查看次数: |
1470 次 |
| 最近记录: |