2017-03-16 27 views
-1

我正在尋找一些更智能的方式來使用IQueryable獲取相關的圖書描述。如何使用linq獲取相關數據

IQueryable list = db.Students.Select(x => new StudentsViewModel 
     { 
      StudentID = x.StudentID, 
      Name = x.Name, 
      BookID = x.BookID, 
      DescriptionForBookByBookID = db.Books.Where(v => v.BookID == x.BookID).Select(v => v.Description).FirstOrDefault().ToString() 
     }); 

感謝您的任何意見;)

+3

更聰明是什麼意思? –

+0

您的模型中的學生和圖書之間是否建立了關係?你在使用實體框架嗎? (如果是這樣,標記它) –

+0

任何其他方法也會很好。 – tomo

回答

2

定義導航屬性爲BookStudent實體:

public int StudentID { get; set; } 
public string Name { get; set; } 
public int? BookID { get; set; } // assume book is optional, but you can use int 
public virtual Book Book { get; set; } 

並用它來獲得本書描述爲視圖模式:

db.Students.Select(s => new StudentsViewModel 
{ 
    StudentID = s.StudentID, 
    Name = s.Name, 
    BookID = s.BookID, 
    DescriptionForBookByBookID = s.Book.Description 
}) 

生成的查詢看起來像

SELECT 
    [Extent1].[StudentID] AS [StudentID], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[BookID] AS [BookID], 
    [Extent2].[Description] AS [Description] 
    FROM [dbo].[Students] AS [Extent1] 
    LEFT OUTER JOIN [dbo].[Books] AS [Extent2] 
     ON [Extent1].[BookID] = [Extent2].[BookID] 
+0

我在猜測學生可以擁有多本書(不是說他的模型反映的是,BookID已定義) –

+0

@ChrisWalsh那麼爲什麼學生擁有BookID外鍵? –

+0

是的,發現了。 –