首页 > 解决方案 > 实体框架选择多对多与连接文本

问题描述

诊断

书:Id,名称,内容,出版
作者:Id,名称
是多对多

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

作者

Id   |   Name
1        Author1
2        Author2
3        Author3
4        Author4

图书作者

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

标签: c#entity-frameworkconsole-application

解决方案


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

我假设基于此您正在使用 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)
   });

推荐阅读