如何在 EF Core 中对 ICollection<T> 应用 Gridify 过滤?

问题描述 投票:0回答:1

参考以下代码

public class Author
{
    public string Name { get; set; }
    public ICollection<Book> Books { get; set;}
}
public class Book
{
    public string Name { get; set; }
    public int AuthorId { get; set; }
    public virtual Author Author { get; set; }
}
[HttpGet]
public async Task<IActionResult> GetAuthors([FromQuery] GridifyQuery query)
{
    var authors = DbContext.Authors
        .AsNoTracking()
        .ApplyFiltering(query);

    var authorsDto = await ObjectMapper.ProjectTo<AuthorDto>(authors)
        .ToListAsync();

    return Ok(authorsDto);
}

问题

我想通过对属性

Authors
应用过滤器来直接从
Author.Books
表中获取作者列表,但目前这是不可能的(即对
ICollection<T>
进行过滤)。

我知道可以通过查询

Books
表然后导航回
Authors
来获取作者列表的解决方法。但是,我想避免这种方法并直接查询
Authors
表。

我尝试制作自定义过滤器,但我很难将 LINQ 查询集成到过滤逻辑中。

参考文献

  1. https://alirezanet.github.io/Gridify/guide/filtering#custom-operators
  2. EF Core 包含一个 ICollection,该集合的引用对象上带有过滤器
c# sql-server entity-framework-core asp.net-core-webapi gridify
1个回答
0
投票

您可以遵循的简单工作演示:

[HttpGet]
public async Task<IActionResult> GetAuthors([FromQuery] GridifyQuery query)
{
    //query for example: "BookName=book1"
    var mapping = new GridifyMapper<Author>()
                 .AddMap("BookName", x => x.Books.Select(c => c.Name));
    var authors = _context.Author
        .AsNoTracking()
        .Include(a => a.Books)
        .ApplyFiltering(query, mapping).ToList();

    //do your stuff...
    return Ok(authors);
}

请求url应该是:

https://localhost:portNumber/home/getauthors?filter=BookName=book1
book1
是图书名称。

© www.soinside.com 2019 - 2024. All rights reserved.