2012-09-23 86 views
2

我使用NHibernate 3和功能NHibernate枚举标志与NHibernate /流利

我有这个枚举

[Flags] 
public enum Permission 
{ 
    View = 1, 
    Add = 2, 
    Edit = 4, 
    Delete = 8, 
    All = View | Add | Edit | Delete 
} 

现在说我要找到具有“查看”或“全部”的所有用户。

我怎么能用nhibernate(linq)来做到这一点?

session.Query<TableA>().Where x.Permission == Permission.View); // does not bring back all 

session.Query<TableA>().Where x.Permission.HasFlag(Permission.View); // crashes 

有没有去用不必去做到这一点

编辑

public class TableAMap : ClassMap<TableA> 
    { 
     public TableAMap() 
     { 
      Id(x => x.Id).GeneratedBy.GuidComb(); 
      Map(x => x.Permission).Not.Nullable().CustomType<PermissionTypes>(); 
     } 
    } 
+0

您能否显示您的映射?你的第二个例子应该工作,我们一直这样做。 –

+0

好的,看看我的映射的OP。 – chobo2

+0

你的枚举如何保存在数据库中?作为数字还是字符串? – cremor

回答

0

如果你有下面的映射为您的TableA的类型:

public class TableAMap : ClassMap<TableA> 
{ 
    public TableAMap() 
    { 
     ... 
     Map(x => x.Permission).CustomType(typeof(Permission)).Not.Nullable(); 
     ... 
    } 
} 

那么你应该能够在你的仓库发出以下查询或任何你做你的数据CCESS:

public IList<TableA> GetTableByPermission(Permission permission) 
{ 
    return Session.Query<TableA> 
        .Where(x => x.Permission == permission || 
           x.Permission == Permission.All) 
        .ToList(); 
} 

或者你也可以检查单个表A实例是否已得到所需的权限:

public bool HasPermission(Guid guid, Permission permission) 
{ 
    var tableA = Session.Query<TableA>.SingleOrDefault(x => x.Id == guid); 

    if (tableA != null) 
     return (tableA.Permission & permission) == permission; 

    // Return false or whatever is appropriate. 
    return false; 
} 

你不能在查询中使用你的HasFlag()方法,NHibernate不理解如何在查询中使用它。

+0

那么这将工作,但我想利用位图,我可以指定视图,即使你有“全部”它将被捕获。 – chobo2

+0

为什么不只是查询权限值并按照您感兴趣的值执行按位和? –

+0

因为我正在查找用户具有查看权限的所有项目。相反,一次去做,然后再回去,然后检查 – chobo2