[CSHARP-3910] LINQ3: Missing calls to PartialEvaluator Created: 18/Oct/21  Updated: 28/Oct/23  Resolved: 18/Oct/21

Status: Closed
Project: C# Driver
Component/s: LINQ3
Affects Version/s: 2.14.0
Fix Version/s: 2.14.0

Type: Bug Priority: Unknown
Reporter: Alexey Anohin Assignee: Robert Stam
Resolution: Fixed Votes: 0
Labels: LINQ
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Upstream Changes Summary:

GetCollection<TEntity>().DeleteMany(mvi => mvi.Description.StartsWith(string.Format("", param))
 
 

 Exception has occurred: CLR/MongoDB.Driver.Linq.Linq3Implementation.ExpressionNotSupportedException  An exception of type 'MongoDB.Driver.Linq.Linq3Implementation.ExpressionNotSupportedException' occurred in MongoDB.Driver.dll but was not handled in user code: 'Expression not supported: Format(NopMigrationDefaults.UpdateMigrationDescriptionPrefix, "4.40.0").' 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.MethodTranslators.StartsWithContainsOrEndsWithMethodToAggregationExpressionTranslator.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.ExpressionToFilterTranslators.ExpressionToFilterTranslator.TranslateUsingAggregationOperators(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ExpressionToFilterTranslator.Translate(TranslationContext context, Expression expression, Boolean exprOk) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ExpressionToFilterTranslator.TranslateLambda(TranslationContext context, LambdaExpression lambdaExpression, IBsonSerializer parameterSerializer) at MongoDB.Driver.Linq.Linq3Implementation.LinqProviderAdapterV3.TranslateExpressionToFilter[TDocument](Expression`1 expression, IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry) at MongoDB.Driver.ExpressionFilterDefinition`1.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry, LinqProvider linqProvider) at MongoDB.Driver.MongoCollectionImpl`1.ConvertWriteModelToWriteRequest(WriteModel`1 model, Int32 index) at System.Linq.Enumerable.<SelectIterator>d__173`2.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation..ctor(CollectionNamespace collectionNamespace, IEnumerable`1 requests, MessageEncoderSettings messageEncoderSettings) at MongoDB.Driver.MongoCollectionImpl`1.CreateBulkWriteOperation(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options) at MongoDB.Driver.MongoCollectionImpl`1.BulkWrite(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.<>c__DisplayClass28_0.<BulkWrite>b__0(IClientSessionHandle session) at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 func, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.BulkWrite(IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionBase`1.<>c__DisplayClass31_0.<DeleteMany>b__0(IEnumerable`1 requests) at MongoDB.Driver.MongoCollectionBase`1.DeleteMany(FilterDefinition`1 filter, DeleteOptions options, Func`2 bulkWriteFunc) at MongoDB.Driver.MongoCollectionBase`1.DeleteMany(FilterDefinition`1 filter, DeleteOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionBase`1.DeleteMany(FilterDefinition`1 filter, CancellationToken cancellationToken) at Nop.Data.MongoDbDataProvider.BulkDeleteEntities[TEntity](Expression`1 predicate) in

 


 Comments   
Comment by Githook User [ 18/Oct/21 ]

Author:

{'name': 'rstam', 'email': 'robert@robertstam.org', 'username': 'rstam'}

Message: CSHARP-3910: LINQ3: Missing calls to PartialEvaluator.
Branch: master
https://github.com/mongodb/mongo-csharp-driver/commit/affee8781da99e6f0e334bd8bbe55fc0fa179715

Comment by Robert Stam [ 18/Oct/21 ]

Thank you for trying the beta version of the new LINQ provider and for reporting this issue.

I had to fill in a few missing pieces, but I was able to reproduce and fix the issue.

This is the repro I used:

public class CSharp3910Tests
{
    [Fact]
    public void test()
    {
        var client = DriverTestConfiguration.Linq3Client;
        var database = client.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName);
        var collection = database.GetCollection<Entity>("csharp3910");
 
        database.DropCollection("csharp3910");
        collection.InsertMany(new[]
        {
            new Entity { Id = 1, Description = "Alpha" },
            new Entity { Id = 2, Description = "Alpha2" },
            new Entity { Id = 3, Description = "Bravo" },
            new Entity { Id = 4, Description = "Charlie" }
        });
 
        var param = "A";
        var result = collection.DeleteMany(mvi => mvi.Description.StartsWith(string.Format("{0}", param)));
 
        result.DeletedCount.Should().Be(2);
    }
 
    public class Entity
    {
        public int Id { get; set; }
        public string Description { get; set; }
    }
}

The actual issue was not with DeleteMany, but with the fact the the parameter to StartsWith was an expression that should have been evaluated down to a constant before translating the LINQ query.

Generated at Wed Feb 07 21:46:39 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.