3

私はnhibernate 3と流暢なnhibernateを使用しています

私はこの列挙型を持っています

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

ここで、「view」または「all」を持つすべてのユーザーを検索したいとします。

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

行かなければならないことでこれを行うには離れていますか

   session.Query<TableA>().Where x.Permission == Permission.View || x.Permission == Permission.All);

編集

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

1 に答える 1

1

TableA タイプに次のマッピングがある場合:

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

次に、リポジトリまたはデータアクセスを行う場所で次のクエリを発行できるはずです。

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

または、単一の TableA インスタンスが必要な権限を持っているかどうかを確認できます。

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 はクエリでそれを使用する方法を理解していません。

于 2012-09-24T11:13:13.720 に答える