我正在使用nHibernate,我需要创建一个这样做的查询:
Course Table
CourseId
CourseName
Task Table // course can have many tasks
TaskName
TaskId
CousreId
现在我需要输入a contains:
session
.Query<Course>()
.Where(x =>
x.Tasks.Contains(/* wants a task object. I want to do it on property level. */) &&
x.CourseId == 1)
我怎么能改变我的查询做一个包含TaskName?
将您的任务投影到TaskName
,然后在其上使用contains。
var query = session
.Query<Course>()
.Where(x => x.Tasks
.Select(t => t.TaskName)
.Contains(myTaskName)
&& x.CourseId == 1);
如果我理解正确的话,你可以使用任何方法
session.Query<Course>().Where(x => x.Tasks.Any(t => t.Name == "task name")
&& x.CourseId == 1);
你试过吗?
var results = session.Query<Course>()
.Where(crs => crs.Tasks.Count(tsk => tsk.TaskName == theName) > 0);
这将计算具有正确名称的任务的数量(在我的示例中在theName
中指定),并返回计数值大于零的所有课程,即包含具有特定名称的任务的所有课程。
您要么必须实现自己的IComparer或IEqualityComparer(我记得,我可能关闭了),并将其基于对象的特定属性。或者用Count()
或Find()
代替。下面是一些伪代码:
session.Query<Course>().Where(x => x.Tasks.Count(t => t.TaskProperty == "something") > 0 && x.CourseId == 1)
我会尝试这样做:
var results = session
.Query<Course>()
.Where(crs => crs.Tasks.Any(tsk => tsk.TaskName == theName) && crs.CourseId == 1);