参考以下代码
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 查询集成到过滤逻辑中。
参考文献
您可以遵循的简单工作演示:
[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
是图书名称。