Ambiguous call when using LINQ extension method on DbSet

ambiguous c# entity-framework-core entity-framework-core-3.1 linq

Question

I am using a LINQ query on a DbSet<T>:

await _dbContext.Users.AnyAsync(u => u.Name == name);

However, the compiler outputs the following error:

Error CS0121: The call is ambiguous between the following methods or properties:
'System.Linq.AsyncEnumerable.AnyAsync<TSource>(System.Collections.Generic.IAsyncEnumerable<TSource>, System.Func<TSource, bool>)' and
'Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.AnyAsync<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource, bool>>)'

A similar problem also occurs with other LINQ extension methods, like .Where().

I am using EF.Core 3.1 and have the System.Linq.Async package installed. How do I fix this issue?

1
1
2/22/2020 12:38:12 AM

Accepted Answer

This problem is caused by a combination of using the System.Linq.Async package and the DbSet<TEntity> class, which implements both IQueryable<TEntity> and IAsyncEnumerable<TEntity>.

In this situation, importing the namespaces System.Linq and Microsoft.EntityFrameworkCore leads to the definition of the conflicting extension methods. Unfortunately, avoiding to import one of them is usually not practicable.

This behavior is present beginning with EF.Core 3.0, and is discussed in this issue.

As a result, EF.Core 3.1 adds two auxiliary functions AsAsyncEnumerable() and AsQueryable(), which explicitly return IAsyncEnumerable<TEntity> respectively IQueryable<TEntity>.

So, the code sample is fixed by calling the desired disambiguation function:

await _dbContext.Users.AsQueryable().AnyAsync(u => u.Name == name);

or

await _dbContext.Users.AsAsyncEnumerable().AnyAsync(u => u.Name == name);
3
2/22/2020 12:38:12 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow