Projections using the EF.Property method throw null ref exceptions, even for non-shadow properties

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Minor - P4
    • None
    • Affects Version/s: None
    • None
    • None
    • Dotnet Drivers
    • None
    • None
    • None
    • None
    • None
    • None

      For example:

      var results = context.Set<Employee>()
          .Select(e => EF.Property<string>(e, "Title"))
          .ToList();
      

      Throws:

      Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
         at MongoDB.EntityFrameworkCore.Query.Visitors.MongoProjectionBindingExpressionVisitor.MatchTypes(Expression expression, Type targetType)
         at MongoDB.EntityFrameworkCore.Query.Visitors.MongoProjectionBindingExpressionVisitor.Translate(MongoQueryExpression queryExpression, Expression expression)
         at MongoDB.EntityFrameworkCore.Query.Visitors.MongoQueryableMethodTranslatingExpressionVisitor.TranslateSelect(ShapedQueryExpression source, LambdaExpression selector)
         at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
         at MongoDB.EntityFrameworkCore.Query.Visitors.MongoQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
         at MongoDB.EntityFrameworkCore.Query.Visitors.MongoQueryableMethodTranslatingExpressionVisitor.Visit(Expression expression)
         at MongoDB.EntityFrameworkCore.Query.MongoQueryCompilationContext.CreateQueryExecutor[TResult](Expression originalQuery)
         at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass11_0`1.<ExecuteCore>b__0()
         at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteCore[TResult](Expression query, Boolean async, CancellationToken cancellationToken)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
         at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
         at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
         at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
         at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
         at Program.<Main>$(String[] args) in /Users/arthur.vickers/code/OnYourOwnNow/OnYourOwnNow/Program.cs:line 19
      

      Full repro

      using var context = new SomeDbContext();
      
      context.Database.EnsureDeleted();
      
      context.AddRange(
          new Employee
              { EmployeeID = 10, City = "Walpole", ReportsTo = 1, Country = "UK", FirstName = "Baxter", Title = "Sales Representative" });
      context.SaveChanges();
      
      var results = context.Set<Employee>()
          .Select(e => EF.Property<string>(e, "Title"))
          .ToList();
          
      foreach (var result in results)
      {
          Console.WriteLine($"Found {result}");
      }
      
      public class SomeDbContext : DbContext
      {
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
              => optionsBuilder
                  .UseMongoDB("mongodb://localhost:27017", "SomeDb2")
                  .LogTo(Console.WriteLine, LogLevel.Information);
      
          protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              modelBuilder.Entity<Employee>().ToCollection("Employees");
          }
      }
      
      public class Employee
      {
          public int EmployeeID { get; set; }
      
          [MaxLength(10)] [Required] public string FirstName { get; set; }
      
          [MaxLength(30)] public string Title { get; set; }
      
          [MaxLength(15)] public string City { get; set; }
      
          [MaxLength(15)] public string Country { get; set; }
      
          public int? ReportsTo { get; set; }
      }
      

              Assignee:
              Unassigned
              Reporter:
              Arthur Vickers
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated: