[CSHARP-2223] Unhandled mongo expression type: Pipeline when using more than one accumulator Created: 23/Mar/18  Updated: 28/Oct/23  Resolved: 11/Feb/22

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

Type: Bug Priority: Major - P3
Reporter: Baris Saydag Assignee: Unassigned
Resolution: Fixed Votes: 0
Labels: triaged
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Visual Studio 2017, both .Net framwork and .Net core.


Epic Link: CSHARP-3615

 Description   

Below query fails because Compare function in ExpressionComparer class in ExpressionComparer.cs file doesn't implement comparison for Pipeline typed expressions:

case ExpressionType.Extension:
var extensionA = (ExtensionExpression)a;
var extensionB = (ExtensionExpression)b;
if (extensionA.ExtensionType != extensionB.ExtensionType)

{ return false; }

switch (extensionA.ExtensionType)
{
case ExtensionExpressionType.Accumulator:
return CompareAccumulator((AccumulatorExpression)extensionA, (AccumulatorExpression)extensionB);
case ExtensionExpressionType.Document:
return CompareDocument((DocumentExpression)a, (DocumentExpression)b);
case ExtensionExpressionType.FieldAsDocument:
return CompareDocumentWrappedField((FieldAsDocumentExpression)a, (FieldAsDocumentExpression)b);
case ExtensionExpressionType.Field:
return CompareField((FieldExpression)a, (FieldExpression)b);
case ExtensionExpressionType.SerializedConstant:
return CompareSerializedConstant((SerializedConstantExpression)a, (SerializedConstantExpression)b);

  • //THIS IS MISSING
    case ExtensionExpressionType.Pipeline:
    return ComparePipelineExpression((PipelineExpression)a, (PipelineExpression)b);
    *
    //THIS EXCEPTION IS THROWN
    default:
    throw new MongoInternalException(string.Format("Unhandled mongo expression type: ' {0}

    '", extensionA.ExtensionType));
    }

Here is the query:
in var Q = DB.Orders
.AsQueryable()
.Where(o => o.Status == Order.Statuses.Shipped && o.PurchaseDateTime >= DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0)) && o.PurchaseDateTime <= DateTime.Now)
.Join(DB.OrderFinances.AsQueryable(), outer => outer.OrderId, inner => inner.OrderId, (inner, outer) => new

{ OrderData = inner, OrderFinancesData = outer }

)
.GroupBy(o => new

{ o.OrderData.PurchaseDateTime.Year, o.OrderData.PurchaseDateTime.Month, o.OrderData.FulfillmentChannel }

)
.Select(o => new

{ TotalRevenue = o.Sum(x => x.OrderData.Items.Sum(it => it.ItemPrice.Amount)), TotalRevenue2 = o.Sum(x => x.OrderData.Items.Sum(it => it.ItemPrice.Amount)), }

);

var R = Q.ToList();}}



 Comments   
Comment by James Kovacs [ 11/Feb/22 ]

This issue has been fixed in the new LINQ provider (known as LINQ3), which is included 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);

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