Как использовать Linq Contains ()? - PullRequest
0 голосов
/ 16 апреля 2011

Я использую 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)

Как мне изменить свой запрос, чтобы он содержал Contains on TaskName?

Ответы [ 5 ]

2 голосов
/ 16 апреля 2011

Проецируйте ваши задачи на TaskName, а затем используйте на них.

var query = session
    .Query<Course>()
    .Where(x => x.Tasks
                 .Select(t => t.TaskName)
                 .Contains(myTaskName)
             && x.CourseId == 1);
1 голос
/ 16 апреля 2011

Если я правильно понял, вы можете использовать любой метод

session.Query<Course>().Where(x => x.Tasks.Any(t => t.Name == "task name")
                                               && x.CourseId == 1);
0 голосов
/ 16 апреля 2011

Я бы попробовал что-то вроде этого:

var results = session
    .Query<Course>()
    .Where(crs => crs.Tasks.Any(tsk => tsk.TaskName == theName) && crs.CourseId == 1);
0 голосов
/ 16 апреля 2011

Вы должны либо реализовать свой собственный IComparer или IEqualityComparer (насколько я помню, я могу быть выключен) и основывать его на определенном свойстве объекта.Или используйте Count() или Find() вместо этого.Вот некоторый псевдокод:

session.Query<Course>().Where(x => x.Tasks.Count(t => t.TaskProperty == "something") > 0 && x.CourseId == 1)
0 голосов
/ 16 апреля 2011

Вы пробовали это?

var results = session.Query<Course>()
      .Where(crs => crs.Tasks.Count(tsk => tsk.TaskName == theName) > 0);

Это должно подсчитать количество задач с правильным именем (указанное в theName в моем примере) и вернуть все курсы, у которых значение счетчика больше нуля, т.е. все курсы, которые содержат задачу с определенным именем.

...