2011-05-08 68 views
2

嗯,我有這樣的: 局:有沒有其他方法可以使這個LINQ查詢工作?

public class Board 
{ 
    public int BoardID { get; set; } 
    public string BoardName { get; set; } 
    public string BoardDescription { get; set; } 
    public int PostCount { get; set; } 
    public int TopicCount { get; set; } 
    public bool IsVisibile { get; set; } 
    public Forum BelongToForum { get; set; } 
    public List<Board> Boards { get; set; } 
    public List<Topic> Topics { get; set; } 
} 

和論壇:

public class Forum 
{ 
    public int ForumID { get; set; } 
    public string ForumName { get; set; } 
    public string ForumDescription { get; set; } 
    public List<Board> Boards { get; set; } 
} 

和方法得到論壇用板:

 public List<Forum> GetForums() 
    { 
     List<Forum> forums = new List<Forum>(); 
     _ctx = new ForumContext(); 
     forums = (from p in _ctx.Forums 
        select p).ToList(); 
     List<Forum> returnForm = new List<Forum>(); 
     foreach(Forum forum in forums) 
     { 
      List<Board> board = (from x in _ctx.Boards 
           where x.BelongToForum.ForumID == forum.ForumID 
           select x).ToList(); 
      forum.Boards = board; 

      returnForm.Add(forum); 
     } 


     return returnForm; 
    } 

它的工作如預期。但是,正如你所看到的,我正在使用三個列表和foreach循環。這對我來說看起來不太好。所以我有一個問題,是否有另一種方法來使它工作?

我想我應該建立另一個模型類,它將從連接或類似的東西收集nessesary數據。 但我想問的是還有其他方法可以做到嗎?

回答

3

如果你看看你的Forum實體,它已經有Boards屬性。您應該能夠使用Include()在一個查詢中實現這些查詢。

forums = (from p in _ctx.Forums.Include("Boards") 
      select p).ToList(); 

或者使用強類型Include()

forums = (from p in _ctx.Forums.Include(x=> x.Boards) 
      select p).ToList(); 

你能澄清這是否是代碼的第一或數據庫第一?從你的例子來看,DB首先與POCO模型一起使用(代碼第一個Boards屬性應該已經物化,因爲它沒有標記爲虛擬)。

+0

代碼優先。但說實話,這是我第一次做代碼。我對這個apporach的認識是非常基本的。 – 2011-05-08 18:41:49

+0

而嘗試使用Lambda的第二個版本時出現錯誤: 「無法將lambda表達式轉換爲類型'string',因爲它不是委託類型」 猜測不適用於Code-First? – 2011-05-08 18:55:38

+1

@ŁukaszBaran:確保在代碼文件中有'使用System.Data.Entity;',那麼你可以使用強類型的版本。 – BrokenGlass 2011-05-08 19:31:49

1

這應該工作:

var returnForm = 
    (
     from forum in _ctx.Forums 
     join b in _ctx.Boards on forum.ForumID equals b.BelongsToForum.ForumID into boards 
     select new { forum, boards } 
    ) 
    .Select(x => 
     { 
      x.forum.Boards = x.boards.ToList(); 
      return x.forum; 
     }) 
    .ToList(); 

棘手的部分是與分配板的列表中forum.Boards財產。這並不完全符合LINQ理念:LINQ是通過某種轉換從前一組數據創建下一組數據,而不是就地修改數據。

由於這個原因,這個賦值部分出來有點難看。但是,如果你使用的是LINQ-to-entities,它可能有一些更優雅的方法來完成你想要完成的任務。儘管如此,我並不是那種技術的專家。

相關問題