Consider the code below when running on different EF Core providers. Assume that there is no-translation of string.ToArray on any provider. EF Core allows this query to run, with ToArray executed on the client. This does not result in any extra-fetching or other poor query generation (although some other cases may) and so is safe.
However, on the Mongo provider it throws, presumably because the driver doesn't allow it.
using var context = new SomeDbContext(); context.Database.EnsureDeleted(); context.Database.EnsureCreated(); context.AddRange(new Order { Id = 1, Foo = "ABCDE" }, new Order { Id = 2, Foo = "ABC" }); context.SaveChanges(); var results = context.Set<Order>().Select(o => o.Foo.ToArray()).ToList(); foreach (var result in results) { Console.WriteLine(result.Length); } public class SomeDbContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder //.UseSqlite("DataSource = db.dat") .UseMongoDB("mongodb://localhost:27017", "SomeDb3") .LogTo(Console.WriteLine, LogLevel.Information); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Order>(); } } public class Order { public int Id { get; set; } public string Foo { get; set; } }
nhandled exception. System.InvalidOperationException: MongoDB.Bson.Serialization.Serializers.StringSerializer must implement IBsonArraySerializer to be used with LINQ. at MongoDB.Driver.Linq.Linq3Implementation.Misc.ArraySerializerHelper.GetItemSerializer(IBsonSerializer serializer) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MethodTranslators.ToArrayMethodToAggregationExpressionTranslator.Translate(TranslationContext context, MethodCallExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MethodCallExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, MethodCallExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(TranslationContext context, LambdaExpression lambdaExpression, Symbol parameterSymbol) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(TranslationContext context, LambdaExpression lambdaExpression, IBsonSerializer parameterSerializer, Boolean asRoot) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToPipelineTranslators.SelectMethodToPipelineTranslator.Translate(TranslationContext context, MethodCallExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToPipelineTranslators.ExpressionToPipelineTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToExecutableQueryTranslators.ExpressionToExecutableQueryTranslator.Translate[TDocument,TOutput](MongoQueryProvider`1 provider, Expression expression, ExpressionTranslationOptions translationOptions) at MongoDB.Driver.Linq.Linq3Implementation.MongoQuery`2.Execute() at MongoDB.Driver.Linq.Linq3Implementation.MongoQuery`2.GetEnumerator() at MongoDB.EntityFrameworkCore.Query.QueryingEnumerable`2.Enumerator.MoveNextHelper() at MongoDB.EntityFrameworkCore.Query.QueryingEnumerable`2.Enumerator.MoveNext() 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 13