[CSHARP-3236] NotSupportedException when using Contains() to Filter Embedded Documents Created: 23/Oct/20  Updated: 27/Oct/23  Resolved: 03/Nov/22

Status: Closed
Project: C# Driver
Component/s: Linq
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Major - P3
Reporter: Mohamad Javad Ebrahimi Assignee: Robert Stam
Resolution: Works as Designed Votes: 1
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

reproduce code

var result = postCollection
    .AsQueryable()
    .Select(p => new
    {
        Id = p.Id,
        Comments = p.Comments.Where(c => c.Text.Contains("test"))
    })
    .ToList();

Message: System.NotSupportedException : Contains of type System.String is not supported in the expression tree {document}{$c.Text}.Contains("test"). Stack Trace: AggregateLanguageTranslator.TranslateMethodCall(MethodCallExpression node) AggregateLanguageTranslator.TranslateValue(Expression node) AggregateLanguageTranslator.TranslateWhere(WhereExpression node) AggregateLanguageTranslator.TranslateValue(Expression node) AggregateLanguageTranslator.TranslatePipeline(PipelineExpression node) AggregateLanguageTranslator.TranslateValue(Expression node) AggregateLanguageTranslator.TranslateMapping(ProjectionMapping mapping) AggregateLanguageTranslator.TranslateNew(NewExpression node) AggregateLanguageTranslator.TranslateValue(Expression node) AggregateLanguageTranslator.Translate(Expression node, ExpressionTranslationOptions translationOptions) QueryableTranslator.TranslateProjectValue(Expression selector) QueryableTranslator.TranslateSelect(SelectExpression node) QueryableTranslator.Translate(Expression node) QueryableTranslator.TranslatePipeline(PipelineExpression node) QueryableTranslator.Translate(Expression node) QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions) MongoQueryProviderImpl`1.Translate(Expression expression) MongoQueryProviderImpl`1.Execute(Expression expression) MongoQueryableImpl`2.GetEnumerator() List`1.ctor(IEnumerable`1 collection) Enumerable.ToList[TSource](IEnumerable`1 source)



 Comments   
Comment by Robert Stam [ 03/Nov/22 ]

This issue has been fixed in the new LINQ provider (known as LINQ3), which was introduced in the 2.14 release.

Configure your MongoClientSettings to use LinqProvider.V3 if you want to use this functionality.

To configure a client to use the LINQ3 provider use code like the following

var connectionString = "mongodb://localhost";
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
clientSettings.LinqProvider = LinqProvider.V3;
var client = new MongoClient(clientSettings);

Comment by Githook User [ 03/Nov/22 ]

Author:

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

Message: CSHARP-3236: Verify that nested Contains works in LINQ3.
Branch: master
https://github.com/mongodb/mongo-csharp-driver/commit/7cba6ac1242141270852fb42ac115222530e0d46

Comment by Robert Stam [ 26/Oct/20 ]

I can confirm that we do not yet support using Contains in this context.

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