加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用“not in”进行NHibernate QueryOver?

发布时间:2020-12-15 21:50:53 所属栏目:百科 来源:网络整理
导读:NHibernate有没有办法让这个查询更容易? 为了理解,这是我想用NHibernate创建的查询: Select * from TaskWhere task_id not in(Select task_id from UserTaskWhere solved = 1 AND [user_id] = 1) 这个是我在NH#中的C#代码 public IListTask RandomTasks(Li
NHibernate有没有办法让这个查询更容易?

为了理解,这是我想用NHibernate创建的查询:

Select * from Task
Where task_id not in
(Select task_id from UserTask
Where solved = 1 AND [user_id] = 1)

这个是我在NH#中的C#代码

public IList<Task> RandomTasks(List<int> subject_ids,int userId)
{
    //Gets all Ids where the User has solved the Task
    List<int> task_ids = new List<int>(_session.Query<UserTask>()
                       .Where(x => x.User.user_id == userId)
                       .Where(x => x.solved)
                       .Select(x => x.Task.task_id));

    //Gets all Tasks except the task_ids from the result of the query befor
    var query = _session.QueryOver<Task>()
                       .Where(s => s.Subject.subject_id.IsIn(subject_ids))
                       .Where(t => !t.task_id.IsIn(task_ids))
                       .Take(10)
                       .List();

    return query;
}

查询返回正确的结果,但我认为可能有一种更简单的方法来获得相同的结果.

解决方法

如果您更喜欢INNER SELECT,NHiberante确实为您提供了解决方案.它被称为DetachedCriteria. (尝试检查 here的类似示例)

首先我们将创建内部选择:

var sub = DetachedCriteria
  .For<UserTask>()
  // WHERE 
  .Add(Restrictions.In("UserId",new int[] { 1,2 })) // example of filtering 'user_id'
  .Add(Restrictions.Eq("solved",true))               // 'solved'
  .SetProjection(Projections.Property("TaskId")); // TaskId the SELECT clause

(我不确定你的模型和命名,例如task_id vs TaskId …但意图应该清楚)

使用DetachedCritera我们可以做很多事情,我们可以加入其他引用的对象/表,过滤它们……就像标准的QueryOver一样.唯一的区别是,我们应该返回Projection(SELECT TaskId)作为另一个查询中的过滤器:

var criteria = session.CreateCriteria<Task>();
criteria
  . Where(...                             // your filters applied on Task
  .Add(Subqueries.PropertyIn("ID",sub)); // Task.ID in (select...

var result = criteria.List();

NOTE. This solution will not only work ;),but mostly,it is ready for
paging and sorting. So even in cases,that the inner select will return more ‘similar’ results (same ids),the upper select will return each task only once…

有关更多信息:15.8. Detached queries and subqueries

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读