Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CSHARP-5473: Provide API to turn LINQ expression into MQL. #1601

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

rstam
Copy link
Contributor

@rstam rstam commented Jan 25, 2025

The BIG question for this PR is whether we want to do this at all, and if so what the public API should be.

@rstam rstam requested a review from a team as a code owner January 25, 2025 21:15
public class CSharp5473Tests : Linq3IntegrationTest
{
[Fact]
public void Select_decimal_divide_should_work()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor : Test method name seems to be wrong.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.

var stages = provider.Translate(queryable, out var outputSerializer);
AssertStages(stages, "{ $project : { _v : { $add : ['$X', 1] }, _id : 0 } }");

var result = queryable.First();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we try to execute translated MQL in some way instead to make sure the translation was done properly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but not necessarily to verify that the translation was done correctly.

I'm more interested in showing HOW you could execute the result of Translate.

@rstam rstam requested a review from sanych-sun January 29, 2025 22:55
Copy link
Member

@sanych-sun sanych-sun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM + minor question.

@@ -152,5 +153,14 @@ public override ExpressionTranslationOptions GetTranslationOptions()
var database = _database ?? _collection?.Database;
return translationOptions.AddMissingOptionsFrom(database?.Client.Settings.TranslationOptions);
}

public override BsonDocument[] Translate<TResult>(IQueryable<TResult> queryable, out IBsonSerializer<TResult> outputSerializer)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we check if provided queryable is MongoDB queryable?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or maybe receiving an expression is sufficient?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be sufficient.

I chose IQueryable to emphasize that it's the Expression associated with an IQueryable that is being translated, not any old expression.

But the .NET method takes an Expression, so we could also here.

@damieng what do you think?

@damieng
Copy link
Member

damieng commented Feb 3, 2025

I think if we want to ship this for now we should use the [Experimental] attribute.

Alternatively I could use reflection to do the same sort of thing on the already-released version and make sure it meets our use cases on the EF provider before shipping.

@rstam
Copy link
Contributor Author

rstam commented Feb 3, 2025

I think if we want to ship this for now we should use the [Experimental] attribute.

Alternatively I could use reflection to do the same sort of thing on the already-released version and make sure it meets our use cases on the EF provider before shipping.

You are the one that asked for this. If you are not sure it does what you need then we shouldn't ship it yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants