1

NHibernate と対話するモジュールを書き直そうとしています。ビジネス ロジックはより複雑になり、linq クエリを Nhibernate の Criteria に変更することにしました。古いコードは次のとおりです。

nhSession.Query<User>().Where(
    u => u.Roles.Contains(query.Role)
)

そして新しいコード:

var criteria = nhSession.CreateCriteria<User>("user");
criteria.Add(/* contains? */);

そしてマッピング:

<class name="User" table="users">
    <id name="Id" column="id">
        <generator class="hilo">
            <param name="table">hilo</param>
            <param name="column">user_id</param>
            <param name="max_lo">10</param>
        </generator>
    </id>

    <property name="Password" column="password" />

    <bag name="Roles" table="user_roles">
        <key column="user_id" />
        <element column="role" />
    </bag>
</class>

Roles は列挙型です。

基準を使用してクエリを Linq クエリのように動作させるにはどうすればよいですか?

4

2 に答える 2

1

テーブルがクラスにuser_rolesマップされていると仮定すると、この質問から、次のようなものを試すことができます:UserRole

DetachedCriteria dCriteria = DetachedCriteria.For<UserRole>("ur")
    .SetProjection(Projections.Property("ur.UserId"))
    .Add(Restrictions.EqProperty("ur.UserId", "user.Id"))     
    .Add(Restrictions.Eq("ur.Role", query.Role));

var criteria = nhSession.CreateCriteria<User>("user")
    .Add(Subqueries.Exists(dCriteria)).List<User>();
于 2013-11-15T10:41:59.630 に答える
1
var criteria = nhSession.CreateCriteria<User>("user");
var roleCriteria = criteria.CreateCriteria("Roles","roles");
roleCriteria.Add(Expression.Eq("role",Role.YourRole);
于 2013-11-15T09:51:25.360 に答える