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