2011-04-16 60 views
0

我使用NHibernate和我需要創建一個查詢,做到這一點:如何使用Linq Contains()?

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) 

我怎樣才能改變我的查詢做一個包含上任務名稱?

+0

VAR的結果= session.Query () .Where(x => x.TaskName.Contains(taskName)&& x.CourseId == 1); 課程課程; if(null!= result){ //獲得課程 } – 2011-04-16 18:20:40

回答

2

將您的任務投影到TaskName,然後使用contains。

var query = session 
    .Query<Course>() 
    .Where(x => x.Tasks 
       .Select(t => t.TaskName) 
       .Contains(myTaskName) 
      && x.CourseId == 1); 
0

你試過了嗎?

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

這應該算使用正確的名稱(在我的例子中theName指定)的任務數,並返回一個具有計數值大於零的所有課程,即包含一個任務與特定所有課程名稱。

0

你要麼必須實現自己的IComparer或的IEqualityComparer(我記得,我可能會關閉),並基於它的對象的特定屬性。或者使用Count()Find()。下面是一些僞代碼:

session.Query<Course>().Where(x => x.Tasks.Count(t => t.TaskProperty == "something") > 0 && x.CourseId == 1) 
1

如果我理解正確的話,你可以用任何方法

session.Query<Course>().Where(x => x.Tasks.Any(t => t.Name == "task name") 
               && x.CourseId == 1); 
0

我會嘗試這樣的事:

var results = session 
    .Query<Course>() 
    .Where(crs => crs.Tasks.Any(tsk => tsk.TaskName == theName) && crs.CourseId == 1);