![](/img/trans.png)
[英]How to convert PostgreSQL query to Linq to SQL for 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.