linq2db / linq2db.EntityFrameworkCore

Bring power of Linq To DB to Entity Framework Core projects
MIT License
462 stars 38 forks source link

EF Core query works but fails with ToLinqtoDB() - "Sequence cannot be converted to SQL"? #211

Closed aloksharma1 closed 2 weeks ago

aloksharma1 commented 2 years ago

Hello i am using EF Core 5.0.13 & Linq2DB 3.5.2 Linq2Db.EfCore Lib 5.0.9

Here is the query that works ok with ef core itself:

var BlogDetailsPage = await _pageRepository.Query().Where(
                x => x.IsActive == true && x.RecordStatus == RecordStatus.Published && x.SiteId == 1
                && x.PageTypeId == _pageTypeRepository.Query().Where(t => t.IsActive == true && t.SiteId == x.SiteId && t.PageTypeName == "BlogByData").Select(t => t.Id).FirstOrDefault())
                .Select(x=>x.PageSlugUrl).FirstOrDefaultAsync();

but if i do a .ToLinqToDB() anywhere after _pageRepository.Query().ToLinqToDB() or .ToLinqToDB().FirstOrDefaultAsync() i get the exception as below:

LinqException: Sequence '[Microsoft.EntityFrameworkCore.Query.QueryRootExpression]' cannot be converted to SQL.

LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
LinqToDB.Linq.Builder.SelectBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
LinqToDB.Linq.Builder.FirstSingleBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.GetSubQuery(IBuildContext context, MethodCallExpression expr)
LinqToDB.Linq.Builder.ExpressionBuilder.GetSubQueryContext(IBuildContext context, MethodCallExpression expr)
LinqToDB.Linq.Builder.ExpressionBuilder.SubQueryToSql(IBuildContext context, MethodCallExpression expression)
LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, bool unwrap, ColumnDescriptor columnDescriptor, bool isPureExpression)
LinqToDB.Linq.Builder.ExpressionBuilder.ConvertCompare(IBuildContext context, ExpressionType nodeType, Expression left, Expression right)
LinqToDB.Linq.Builder.ExpressionBuilder.ConvertPredicate(IBuildContext context, Expression expression)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSearchCondition(IBuildContext context, Expression expression, List<SqlCondition> conditions)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSearchCondition(IBuildContext context, Expression expression, List<SqlCondition> conditions)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSearchCondition(IBuildContext context, Expression expression, List<SqlCondition> conditions)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildWhere(IBuildContext parent, IBuildContext sequence, LambdaExpression condition, bool checkForSubQuery, bool enforceHaving)
LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
LinqToDB.Linq.Builder.SelectBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
LinqToDB.Linq.Builder.FirstSingleBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
LinqToDB.Linq.Builder.ExpressionBuilder.Build<T>()
LinqToDB.Linq.Query<T>.CreateQuery(ExpressionTreeOptimizationContext optimizationContext, ParametersContext parametersContext, IDataContext dataContext, Expression expr)
LinqToDB.Linq.Query<T>.GetQuery(IDataContext dataContext, ref Expression expr, out bool dependsOnParameters)
LinqToDB.Linq.ExpressionQuery<T>.GetQuery(ref Expression expression, bool cache, out bool dependsOnParameters)
LinqToDB.Linq.ExpressionQuery<T>.LinqToDB.Async.IQueryProviderAsync.ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
sdanyliv commented 2 years ago

Thanks for reporting, will check.

sdanyliv commented 2 years ago

Well, sorry for delay. Probably I need also code of your repository. I cannot preproduce.

aloksharma1 commented 2 years ago

Ok, i will need some time to bifurcate this part from my project.

MaceWindu commented 2 weeks ago

Closing for now as no additional details provided