gpt4 book ai didi

c# - 如何使用 "not in"执行 NHibernate QueryOver?

转载 作者:行者123 更新时间:2023-11-30 12:47:36 24 4
gpt4 key购买 nike

有没有办法使用 NHibernate 简化此查询?

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

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

这是我使用 NHibernate 在 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 与 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

关于c# - 如何使用 "not in"执行 NHibernate QueryOver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16509622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com