2011-01-19 164 views
1

我有一個多3個表,他們之間有很多關係EF和LINQ - 多對多的關係

用戶:ID(PK),名稱

UserCourses:用戶ID(PK),CourseId(PK)

課程:ID(PK),名稱

我需要寫一個LINQ查詢,選擇用戶X的所有課程名稱,並在返回的IEnumerable,但我無法得到它的工作。

編輯:

public IEnumerable<Courses> GetCourses 
     { 
      get 
      { 
       return (from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a.Courses.AsEnumerable() 
         ); 
      } 
     } 

任何幫助非常讚賞

感謝

+0

我剛添加了代碼 – user441365 2011-01-19 14:20:46

+0

當你運行這個時發生了什麼?你收到錯誤的數據了嗎?拋出異常? – 2011-01-19 14:49:20

+0

錯誤31無法將類型'System.Linq.IQueryable >'隱式轉換爲'System.Collections.Generic.IEnumerable '。存在明確的轉換(您是否缺少演員?) – user441365 2011-01-19 15:11:23

回答

2

對於發生了什麼問題你有點不清楚,但看起來它會產生一個IEnumerable<IEnumerable<Courses>>類型。如果你正在尋找一個扁平IEnumerable<Courses>,我認爲你是,你需要的東西,如:

public IEnumerable<Courses> GetCourses 
    { 
     get 
     { 
      var query = from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a; 

      return query.FirstOrDefault().Courses; 
     } 
    } 

編輯:爲了避免一個NullReferenceException,試試這個來代替:

public IEnumerable<Courses> GetCourses 
    { 
     get 
     { 
      var query = from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a.Courses; //note the difference 

      return query.SelectMany(i => i); 
     } 
    } 

請注意,有多種方法可以做到這一點;例如,你也可以使用:

  var query = from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a; 

      var user = query.FirstOrDefault(); 

      return user == null 
         ? user.Courses 
         : null; 

如果SelectMany版本還是引起了一個NullReferenceException,使用這個來代替。我不認爲它應該,但我沒有測試它。你表示Rup的解決方案已經完成了,他使用SelectMany的方式與我很相似,因此最後一個版本可以安全使用。

0

試一下

from b in _entities.Users.Include("UserCourses") on a.UserID equals this.ID 
join c in _entities.Users.Include("Courses") on b.CourseID equals c.ID 
select c.name 
2

或多或少看起來不錯給我。如果你只是放棄.AsEnumerable(),那麼這不起作用嗎?我不認爲你需要這個。

我更喜歡LINQ擴展方法調用語法;我想辦法只是課程名稱做那樣是在

var courses = _entities.Users.Include("Courses") 
         .Where(a => a.Id == this.Id) 
         .SelectMany(a => a.Courses); 

一個額外.Select(c => c.Name)