2017-03-16 62 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

是的,发现了。 –