c# – 如何使用“not in”进行NHibernate QueryOver?
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();
有关更多信息:15.8. Detached queries and subqueries (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |