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

Where Condition or Count Expression throws Exception (removeing one of them then the query works) #4390

Open
jogibear9988 opened this issue Jan 25, 2024 · 3 comments · Fixed by #4391
Labels
status: has-pr There is active PR for issue type: bug

Comments

@jogibear9988
Copy link
Member

jogibear9988 commented Jan 25, 2024

Describe your issue

I get this exception:

Exception message: 

System.InvalidCastException : Converted FuncLikePredicate expression is not a Predicate expression.

Stack trace:

>	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.ConvertInternal(LinqToDB.SqlQuery.IQueryElement element) Line 528	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.ConvertInternal(LinqToDB.SqlQuery.IQueryElement element) Line 365	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.Convert<LinqToDB.SqlQuery.SqlCondition>(System.Collections.Generic.List<LinqToDB.SqlQuery.SqlCondition> list1, LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.Clone<LinqToDB.SqlQuery.SqlCondition> clone) Line 1578	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.Convert<LinqToDB.SqlQuery.SqlCondition>(System.Collections.Generic.List<LinqToDB.SqlQuery.SqlCondition> list) Line 1556	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.ConvertInternal(LinqToDB.SqlQuery.IQueryElement element) Line 354	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.ConvertInternal(LinqToDB.SqlQuery.IQueryElement element) Line 365	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.Convert<LinqToDB.SqlQuery.SqlCondition>(System.Collections.Generic.List<LinqToDB.SqlQuery.SqlCondition> list1, LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.Clone<LinqToDB.SqlQuery.SqlCondition> clone) Line 1578	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.Convert<LinqToDB.SqlQuery.SqlCondition>(System.Collections.Generic.List<LinqToDB.SqlQuery.SqlCondition> list) Line 1556	C#
 	linq2db.dll!LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>.ConvertInternal(LinqToDB.SqlQuery.IQueryElement element) Line 354	C#
 	linq2db.dll!LinqToDB.SqlProvider.OptimizationContext.ConvertAll<LinqToDB.SqlQuery.IQueryElement>(LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext context, LinqToDB.SqlQuery.IQueryElement element, System.Func<LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>, LinqToDB.SqlQuery.IQueryElement, LinqToDB.SqlQuery.IQueryElement> convertAction, System.Func<LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>, bool> parentAction) Line 141	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimization(LinqToDB.SqlQuery.IQueryElement element, LinqToDB.SqlProvider.OptimizationContext optimizationContext, LinqToDB.SqlProvider.BasicSqlOptimizer optimizer, LinqToDB.Mapping.MappingSchema mappingSchema, LinqToDB.DataOptions dataOptions, bool register, System.Func<LinqToDB.SqlQuery.ConvertVisitor<LinqToDB.SqlProvider.BasicSqlOptimizer.RunOptimizationContext>, LinqToDB.SqlQuery.IQueryElement, LinqToDB.SqlQuery.IQueryElement> func) Line 2093	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlOptimizer.OptimizeElement(LinqToDB.Mapping.MappingSchema mappingSchema, LinqToDB.DataOptions dataOptions, LinqToDB.SqlQuery.IQueryElement element, LinqToDB.SqlProvider.OptimizationContext optimizationContext, bool withConversion) Line 2140	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlOptimizer.ConvertElement(LinqToDB.Mapping.MappingSchema mappingSchema, LinqToDB.DataOptions dataOptions, LinqToDB.SqlQuery.IQueryElement element, LinqToDB.SqlProvider.OptimizationContext context) Line 1948	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.ConvertElement<LinqToDB.SqlQuery.SqlSearchCondition>(LinqToDB.SqlQuery.SqlSearchCondition element) Line 134	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.BuildWhere(LinqToDB.SqlQuery.SelectQuery selectQuery) Line 2106	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.BuildWhereClause(LinqToDB.SqlQuery.SelectQuery selectQuery) Line 2113	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.BuildSelectQuery(LinqToDB.SqlQuery.SqlSelectStatement selectStatement) Line 428	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.BuildSqlImpl() Line 315	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.BuildSql() Line 308	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.BuildSql(int commandNumber, LinqToDB.SqlQuery.SqlStatement statement, System.Text.StringBuilder sb, LinqToDB.SqlProvider.OptimizationContext optimizationContext, int indent, bool skipAlias) Line 170	C#
 	linq2db.dll!LinqToDB.SqlProvider.BasicSqlBuilder.BuildSql(int commandNumber, LinqToDB.SqlQuery.SqlStatement statement, System.Text.StringBuilder sb, LinqToDB.SqlProvider.OptimizationContext optimizationContext, int startIndent) Line 143	C#
 	linq2db.dll!LinqToDB.Data.DataConnection.QueryRunner.GetCommand(LinqToDB.Data.DataConnection dataConnection, LinqToDB.Linq.IQueryContext query, LinqToDB.SqlQuery.IReadOnlyParameterValues parameterValues, bool forGetSqlText, int startIndent) Line 241	C#
 	linq2db.dll!LinqToDB.Data.DataConnection.QueryRunner.CreateExecutionQuery(LinqToDB.Data.DataConnection dataConnection, LinqToDB.Linq.IQueryContext context, LinqToDB.SqlQuery.IReadOnlyParameterValues parameterValues, bool forGetSqlText) Line 189	C#
 	linq2db.dll!LinqToDB.Data.DataConnection.QueryRunner.SetQuery(LinqToDB.SqlQuery.IReadOnlyParameterValues parameterValues, bool forGetSqlText) Line 323	C#
 	linq2db.dll!LinqToDB.Linq.QueryRunnerBase.SetCommand(bool forGetSqlText) Line 72	C#
 	linq2db.dll!LinqToDB.Data.DataConnection.QueryRunner.ExecuteReader() Line 622	C#
 	linq2db.dll!LinqToDB.Linq.QueryRunner.ExecuteElement<object>(LinqToDB.Linq.Query query, LinqToDB.IDataContext dataContext, LinqToDB.Linq.QueryRunner.Mapper<object> mapper, System.Linq.Expressions.Expression expression, object[] ps, object[] preambles) Line 855	C#
 	linq2db.dll!LinqToDB.Linq.QueryRunner.SetRunQuery.AnonymousMethod__0(LinqToDB.IDataContext db, System.Linq.Expressions.Expression expr, object[] ps, object[] preambles) Line 841	C#
 	linq2db.dll!LinqToDB.Linq.ExpressionQuery<Tests.UserTests.IssueXXXXTests.MlogCombined2>.Execute<int>(System.Linq.Expressions.Expression expression) Line 307	C#
 	linq2db.Tests.dll!Tests.UserTests.IssueXXXXTests.IssueXXXXTest(string context) Line 62	C#

Steps to reproduce

If you remove the Where Condition, or if you comment out the line:

  Count = irs.Count(x => x.InfeedAdviceID == infeed.Id),

the query works.

	public class IssueXXXXTests : TestBase
	{
		[Table]
		public class InfeedAdviceDTO
		{
			[Column] public int Id { get; set; }
		}

		[Table]
		public class InventoryResourceDTO
		{
			[Column] public int InfeedAdviceID { get; set; }
		}
		public class MlogCombined1
		{
			public InfeedAdviceDTO? InfeedAdvice { get; set; }

			public int? Count { get; set; }
		}

		public class MlogCombined2
		{
			public MlogCombined1? MlogCombined1 { get; set; }
		}

		[Test]
		public void IssueXXXXTest([IncludeDataSources(TestProvName.AllSQLite)] string context)
		{
			using (var db = GetDataContext(context))
			using (db.CreateLocalTable<InfeedAdviceDTO>())
			using (db.CreateLocalTable<InventoryResourceDTO>())
			{
				db.Insert(new InventoryResourceDTO() { InfeedAdviceID = 1 });
				db.Insert(new InfeedAdviceDTO() { Id = 1 });

				var irs = from ir in db.GetTable<InventoryResourceDTO>() select ir;

				var qry = from infeed in db.GetTable<InfeedAdviceDTO>()
								join inventory in db.GetTable<InventoryResourceDTO>() on infeed.Id equals inventory.InfeedAdviceID
								select new MlogCombined2
								{
									MlogCombined1 = new MlogCombined1
									{
										InfeedAdvice = infeed,
										Count = irs.Count(x => x.InfeedAdviceID == infeed.Id),
									}
								};

				var l = qry.Where(x => x.MlogCombined1 != null).Count();
			}
		}
	}

Environment details

Linq To DB version: master (git)

Database (with version): SQLite (but happens also on SQLServer

@jogibear9988 jogibear9988 changed the title Repeating a Where Condition causes Linq2Db to throw a Exception Where Condition or Count Expression throws Exception (removeing one of them then the query works) Jan 25, 2024
jogibear9988 added a commit that referenced this issue Jan 25, 2024
@jogibear9988
Copy link
Member Author

Added Pull Request with test: #4391

@jogibear9988 jogibear9988 linked a pull request Jan 25, 2024 that will close this issue
@jogibear9988
Copy link
Member Author

image image

@jogibear9988
Copy link
Member Author

Maybe related to #4347 but it's a complete different error....
But it also works partly.

MaceWindu added a commit that referenced this issue May 15, 2024
* test for issue #4390

* Corrected tests.

---------

Co-authored-by: Svyatoslav Danyliv <sdanyliv@gmail.com>
Co-authored-by: MaceWindu <MaceWindu@users.noreply.github.com>
@MaceWindu MaceWindu added this to the 6.0.0-preview.1 milestone May 15, 2024
@MaceWindu MaceWindu added type: bug status: has-pr There is active PR for issue labels May 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status: has-pr There is active PR for issue type: bug
Development

Successfully merging a pull request may close this issue.

2 participants