如何解决控制器内的 Linq 查询返回一个包含大量不需要的重复数据的数组
我对控制器返回结果的方式有一个不寻常的问题。
我的项目使用 .Net Core Entity Framework 和 SQL Server。
返回的数据是 AuthorList 表中的 1 个 Author 行,AuthorBooks 表中的 3 Book 行。
这些书有一个 authorId,将它们链接到 AuthorList 表。
在 SQL 中我只做一个 SELECT * FROM AuthorBooks WHERE authorId = 'author_33'
然后返回 AuthorBooks 中的 3 行书籍。
但是返回的 JSON 不是我需要的。
它列出了一个数组,每本书都有一个作者数组。所以它复制了很多数据,就像这样:
[
{
"bookId": "1a","authorId": "author_33","bookText": "English_Variant1","author": {
"authorId": "author_33","authorText": "Bio Book 102","authorBooks": [
{
"bookId": "4a","bookText": "English",},{
"bookId": "9a","bookText": "Spanish",}
]
}
},{
"bookId": "4a","authorBooks": [
{
"bookId": "1a",{
"bookId": "9a",{
"bookId": "4a",}
]
}
}
]
但我需要它看起来像这样(注意它看起来有多漂亮):
"author": {
"authorId": "author_33","authorBooks":
[
{
"bookId": "1a",}
]
}
返回 JSON 数据的控制器非常简单:
[HttpGet("GetBooksByAuthorId/{id}")]
public async Task<ActionResult<IEnumerable<AuthorBooks>>> GetBooksByAuthorId(Guid id)
{
var booksByAuthor = await _context.AuthorBooks.Where(q => q.AuthorId == id).ToListAsync();
return booksByAuthor;
}
这是我的 AuthorBooks 模型:
public partial class AuthorBooks
{
public Guid BookId { get; set; }
public Guid? AuthorId { get; set; }
public string BookText { get; set; }
public virtual AuthorList Author { get; set; }
}
这是我的 AuthorList 模型:
public partial class AuthorList
{
public Guid AuthorId { get; set; }
public string AuthorText { get; set; }
public virtual ICollection<AuthorBooks> AuthorBooks { get; set; }
}
在我的数据库上下文中,它们看起来像这样:
作者书籍:
modelBuilder.Entity<AuthorBooks>(entity =>
{
entity.HasKey(e => e.BookId);
entity.HasOne(d => d.Author)
.WithMany(p => p.AuthorBooks)
.HasForeignKey(d => d.AuthorId)
.OnDelete(DeleteBehavior.Cascade)
entity.ToTable("AuthorBooks");
entity.Property(e => e.BookId)
.HasColumnName("BookId");
entity.Property(e => e.AuthorId)
.HasColumnName("AuthorId");
entity.Property(e => e.BookText)
.HasColumnName("BookText");
});
作者列表:
modelBuilder.Entity<AuthorList>(entity =>
{
entity.HasKey(e => e.AuthorId);
entity.ToTable("AuthorList");
entity.Property(e => e.AuthorId)
.HasColumnName("AuthorId");
entity.Property(e => e.AuthorText)
.HasColumnName("AuthorText");
});
我认为这可能与我在模型中使用的 ICollections 有关。
但是当我删除它们时,我的数据库上下文类出现错误。
所以我有点不知所措。
有没有办法格式化它,使其不会复制大量数据?
谢谢!
解决方法
看起来您想要返回根对象“AuthorList”,而不是“AuthorBooks”。在您的上下文中找到正确的作者并将其返回。
,在您的控制器中,您可以查询包括相关书籍的作者,并相应地更改您的操作方法的返回类型以反映查询结果的类型 -
[HttpGet("GetBooksByAuthorId/{id}")]
public async Task<ActionResult<AuthorList>> GetBooksByAuthorId(Guid id)
{
var authorWithBooks = await _context.AuthorLists
.Include(p=> p.AuthorBooks)
.FirstOrDefaultAsync(p=> p.AuthorId == id);
return authorWithBooks;
}
这将匹配您预期的 JSON 结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。