簡體   English   中英

如何將linq查詢轉換為Nhibernate的條件?

[英]How to convert linq query to Nhibernate's Criteria?

我打算重寫一個與NHibernate交互的模塊。 商務邏輯變得更加復雜,我們決定將linq查詢更改為Nhibernate的條件。 這是舊的代碼:

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>

角色是枚舉。

如何使使用Criteria的查詢的行為類似於Linq查詢?

var criteria = nhSession.CreateCriteria<User>("user");
var roleCriteria = criteria.CreateCriteria("Roles","roles");
roleCriteria.Add(Expression.Eq("role",Role.YourRole);

假設將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>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM