web-dev-qa-db-fra.com

Filtrage sur Inclure dans EF Core

J'essaie de filtrer sur la requête initiale. J'ai imbriqué inclure feuilles d'un modèle. J'essaie de filtrer en fonction d'une propriété sur l'un des includes. Par exemple:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
            .ThenInclude(post => post.Author)
        .ToList();
}

Comment puis-je aussi dire .Where(w => w.post.Author == "me")?

11
Jason N. Gaylord

Pas faisable.

Une discussion est en cours sur ce sujet: https://github.com/aspnet/EntityFramework/issues/1833

Je suggèrerais de chercher dans les bibliothèques tierces énumérées ici, par exemple: https://github.com/jbogard/EntityFramework.Filters

14
alessalessio

Vous pouvez également inverser la recherche. 

{
    var blogs = context.Author
    .Include(author => author.posts)
        .ThenInclude(posts => posts.blogs)
    .Where(author => author == "me")
    .Select(author => author.posts.blogs)
    .ToList();
}
6
Frank Horemans

Pas sûr de Include () AND ThenInclude (), mais il est simple de le faire avec un seul include:

var filteredArticles = 
    context.NewsArticles.Include(x => x.NewsArticleRevisions)
    .Where(article => article.NewsArticleRevisions
        .Any(revision => revision.Title.Contains(filter)));

J'espère que cela t'aides!

1
Ross

Bien que ce ne soit (encore en discussion) pas réalisable avec EF Core, j'ai réussi à le faire en utilisant Linq to Entities sur EF Core DbSet. Dans votre cas au lieu de:

var blogs = context.Blogs
        .Include(blog => blog.Posts)
            .ThenInclude(post => post.Author)
        .ToList()

.. tu auras:

await (from blog in this.DbContext.Blogs
           from bPost in blog.Posts
           from bpAuthor in bPost.Author
           where bpAuthor = "me"
           select blog)
.ToListAsync();
0
Kalin Krastev

La solution en ligne la plus simple que j'ai utilisée serait quelque chose comme:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
            .ThenInclude(post => post.Author)
        .FromSql("Select b.* from Blogs b inner join Posts p on b.BlogId = p.BlogId where p.Author = 'me'")
        .ToList();
}
0
Ian