实体框架使用concat文本选择多对多

时间:2018-08-24 20:19:32

标签: c# entity-framework console-application

diag

clas

图书:ID,名称,内容,出版物
作者:Id,Name
多对多

Id   |   Name   |   Content   |   Publishment
1        book1    somecontent     some pub
2        book2     somecont        somepub

作者

Id   |   Name
1        Author1
2        Author2
3        Author3
4        Author4

BookAuthor

IdBook   |   IdAuthor
1            2
1            3
1            4
2            1
2            3

我如何获得类似的东西:

Name   |   Content   |   Author
Book1    some content     Author2,Author3,Author3
Book2     somecontent      Author1,Author3

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。

基于此,我认为您使用DB-first。在这种情况下,您的实体将创建为部分类。为您的Book类创建一个新的部分类文件,并添加一个新属性以检索作者姓名。像这样:

public partial class Book
{
   public string AuthorNames => string.Join(", ", authors.Select(a => a.Name));
}

为防止多次访问数据库以检索关联的作者,请在检索图书时使用include。

var books = myContext.Books.Include(nameof(Book.authors));

另一种方法是使用投影创建匿名类型。

var books = myContext.Books
   .Select(b => new { 
      b.Name, 
      b.Content, 
      AuthorNames = b.authors.Select(a => a.Name) 
   })
   .AsEnumerable()
   .Select(b => new {
      b.Name,
      b.Content,
      Authors = string.Join(", ", b.AuthorNames)
   });