如何使用Linq Contains()?

时间:2011-04-16 18:15:17

标签: c# linq nhibernate contains

我正在使用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上执行包含?

5 个答案:

答案 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);