-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support filtered Include #1833
Comments
Historically this was not supported by EF, However this would be a nice feature to have. We had to implement something similar ourselves in the our code base using Linq tree rewriting. It hope the EF team considers this. |
Yeah. I noticed discussion of this in the |
Moving to back log as a new feature (we do want to support filtered include but it is a lower priority than some other features that were available in EF6). |
Opened new issue for better exception message #1883 |
Don't underestimate the value of filtered include. It was a top request in ef 6. |
Any non-trivial development using the Entity Framework will encounter this limitation. It also has consequences on other technologies likes the OData protocol, because there is really no point to adding filtered $expands to the protocol if EF does not support them. For those who are not (yet) familiar with the internals of EF Core, could you point us to the parts of the Entity Framework that would be impacted in order support this ? |
I too would love this feature. |
@rowanmiller so what is the current way of using left join with a where clause \ on clause?
It's a mess... and bad performance-wise. |
Will Filtered Loading be supported at configuration level, in order to have one to many navigation property filtered upstream? Can this feature be someway useful to avoid bad configurations with circular reference like this? |
@lucacestola I'm not sure why you think it's related to conditional querying of a navigation property. |
@gdoron because it could be also applyed to one to many relationships and would be implicit. Actually, with EF 6, I was not yet able to find a good solution for the relation type like the one at the posted link, without using a circular FK and, at the meantime, have the possibility to use an expression like this: I know that this kind of relations depends on a very custom logic so there is no simple way to address such a need, and I was hoping that, configuring the way relationships are loaded could almost partially address the issue. |
I just have the exactly same need as @gdoron (and not surprising, with |
I'm also in the @gdoron scenario, but I return a collection instead of a single record so I'm doing a foreach on the collection and something like |
You can query stories without including comments, then query separately comments and Explicit loading them: https://docs.efproject.net/en/latest/querying/related-data.html |
Looks interesting, but I need to filter the first query to only return a record if there are any results in the specific navigation property, so I need to have the include or change the result of the first query when the explicit loading doesn't return anything which I think it's worse. |
@atrauzzi well, this feature was and still is idle for years in EF, so I'm afraid ... 😢 |
Yes, this feature request has been around a while. I found it posted on UserVoice since 2010. It's crucial for allowing me to properly load my complex data model, so I hope it's soon given higher priority. |
@rowanmiller @divega Can you please share with us when if ever this is going to be implemented? Consider this simplified scheme:
Now lets say I want to query 10 posts for my blog homepage with their single Primary image. As our application is getting more sophisticated and gets more traffic, this is becoming a real and significant pain and we need a solution for this. Is it going to have the same luck as the feature request on EF which was and still is idle for 6 years? We really need an answer, there are solutions like denormalize our data model but that's rarely a good idea. Thanks! |
@rowanmiller I'm sure everyone has different points of view and needs but here are my two cents: e.g. But Filtered Include has 0 reasonable workarounds. So reiterating what @mikes-gh wrote months ago:
I had already 3 projects on EF Core, and it was a requirement and a pain in ALL of them. |
Just to be clear, the items on the roadmap are the very top of the 100s of feature requests we have sitting on the backlog. So it's inclusion on the list means that it is one of our top priorities. The split between "Critical" and "High Priority" is always subjective. The current split is based on our imperfect aggregation of the feedback from all our customers. It's not as clean as true filtered loading support, but you can do something like this to do filtered loading. It will run two queries, but that is what EF Core would do under the covers anyway, when you load a collection. var blogs = db.Blogs
.Where(b => b.Rating> 3)
.ToList();
var blogIds = blogs.Select(b => b.BlogId).ToList();
db.Posts.Where(p => blogsIds.Contains(p.BlogId))
.Where(p => p.Rating > 3)
.Load(); |
I thought it's a temporary limitation that you're working on fixing. Anyway, it might be acceptable for one collection loading, but when you have 10 included entities (we already have 6-7 in some places,), that means 11 round trips or querying the DB with 10 connections concurrently. I might got you wrong, but if I didn't... Houston we have a problem. |
Allows for additional operations to be specified inside Include/ThenInclude expression when the navigation is a collection: - Where, - OrderBy(Descending)/ThenBy(Descending), - Skip, - Take. Those additional operations are treated like any other within the query, so translation restrictions apply. Collections included using new filter operations are considered to be loaded. Only one filter is allowed per navigation. In cases where same navigation is included multiple times (e.g. Include(A).ThenInclude(A_B).Include(A).ThenInclude(A_C)) filter should only be applied once. Alternatively the same exact filter should be applied to all.
Allows for additional operations to be specified inside Include/ThenInclude expression when the navigation is a collection: - Where, - OrderBy(Descending)/ThenBy(Descending), - Skip, - Take. Those additional operations are treated like any other within the query, so translation restrictions apply. Collections included using new filter operations are considered to be loaded. Only one filter is allowed per navigation. In cases where same navigation is included multiple times (e.g. Include(A).ThenInclude(A_B).Include(A).ThenInclude(A_C)) filter should only be applied once. Alternatively the same exact filter should be applied to all.
Fixed in 21b9a35 Example: customers.Include(c => c.Orders.Where(o => o.Name != "Foo").OrderByDescending(o => o.Id).Take(3)) Supported operations: Where, OrderBy/ThenBy, Skip, Take. Only one filter allowed per navigation, so for cases where the same navigation needs to be included multiple times (e.g. multiple ThenInclude on the same navigation) apply the filter only once, or apply exactly the same filter for that navigation. Example: customers
.Include(c => c.Orders.Where(o => o.Name != "Foo")).ThenInclude(o => o.OrderDetails)
.Include(c => c.Orders).ThenInclude(o => o.Customer) or customers
.Include(c => c.Orders.Where(o => o.Name != "Foo")).ThenInclude(o => o.OrderDetails)
.Include(c => c.Orders.Where(o => o.Name != "Foo")).ThenInclude(o => o.Customer) Feature will ship in the next preview, but should be available in our daily builds shortly for anyone interested in taking an early look. If you find some problems please file new issue as this thread is already very long. |
Is there a chance that we get this feature in a stable release before winter? Virtually all my dotnet projects would benefit from this, but I am reluctant to ship releases that depend on preview versions. |
I'm currently using something like that. var productsWithEnglishTranslations = await _context.Products
.Select(p => new Product
{
Id = p.Id,
Name = p.Name,
Price = p.Price,
Translations = p.Translations.Where(pt => pt.Language == 'en'),
})
.ToListAsync(); |
@Trolldemorted filtered includes will only be released with 5.0.0 - we only released bug fixes in patch release (i.e. for 3.1.x) to reduce the risk of introducing breakage. |
Thanks |
I don't see why this isn't working then!
It gives me the error: "Expression of type 'System.Linq.IOrderedQueryable Did this feature not make it beyond preview? I don't see anyone else suggesting using this method either. Thanks, Jonathan |
@appsupport-gc what if you remove the orderbys and maybe just try one where on an include and then the other can you narrow it down to anything? |
Oh I thought I saw suggested that orderbys on sub includes were now supported. I was hoping that was the case. It looks like I misread above and misunderstood the source linking here... Too bad. Some way to include OrderBys with ThenIncludes would be great! I guess my only option is manually stepping through each level of object? :( |
The example above suggests this should work: "customers.Include(c => c.Orders.Where(o => o.Name != "Foo").OrderByDescending(o => o.Id).Take(3))" That should be equivalent to dc.YearEntities.Include(ye => ye.EntitySections.OrderBy(es => es.SectionOrder)) which doesn't work for me. |
Check the documentation for Filtered include and if it isn't working as documented then create a New issue with more information. |
Gosh what an awesome feature. Works like a champ. 💪 Thank you so much for putting this together and all your efforts out there. 👍 |
This is really cool! How can I dynamically build a predicate for this? If I compile the |
@CollinAlpert |
@smitpatel Thanks for your reply. The navigation property used in my |
Hello, |
We keep this issue to track specifying filters inline when you specify eager loading in a query. However there are many scenarios that can be satisfied with global query filters:
Please learn about global query filters
We are seeing that a large portion of the scenarios customers want this feature for can already be better addressed using global query filters. Please try to understand that feature before you add your vote to this issue.
We are keeping this issue open only to represent the ability to specify filters on Include on a per-query basis, which we understand can be convenient on some cases.
Original issue:
Doing a
.Where()
inside a.Include()
is allowed (by the syntax, it fails in execution). However, if you then follow that up with a.ThenInclude()
, like so:You get the following error:
Is this something you're aware of and going to allow in a future version, or am I just doing something wrong and It's already supported?
The text was updated successfully, but these errors were encountered: