PostgreSQL Test Problem Where filter using let var FirstOrDefault()
See original GitHub issueModel
[Table(Schema="Member", Name="TableName")]
public partial class TableName
{
[PrimaryKey, NotNull ] public int Id { get; set; } // integer
[Column, Nullable] public string FirstName { get; set; } // character varying(64)
[Column, Nullable] public string MiddleName { get; set; } // character varying(64)
[Column, Nullable] public string LastName { get; set; } // character varying(64)
}
[Table(Schema="Member", Name="TableStatus")]
public partial class TableStatus
{
[PrimaryKey, NotNull] public int StatusId { get; set; } // integer
[Column, NotNull] public string StatusName { get; set; } // character varying
}
execute:
db.TableName.Delete();
db.TableStatus.Delete();
var query = (from x in db.TableName
let status = db.TableStatus.FirstOrDefault(y => y.StatusId == x.Id)
select new
{
Id = status != null ? status.StatusId : x.Id,
StatusName = status != null ? status.StatusName : "abc",
}).Where(x => x.StatusName == "abc");//must add .Where(x => x.StatusName == "abc") to reproduce error
query.ToArray();
error detail:
Exception thrown: 'LinqToDB.Linq.LinqException' in linq2db.dll
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>PGTest.exe</AppDomain><Exception><ExceptionType>LinqToDB.Linq.LinqException, linq2db, Version=3.5.1.0, Culture=neutral, PublicKeyToken=e41013125f9e410a</ExceptionType><Message>'value(TestMember.Models.TestMemberEntities).GetTable().Where(y =&gt; (y.StatusId == &lt;&gt;h__TransparentIdentifier0.x.Id)).FirstOrDefault().StatusName' cannot be converted to SQL.</Message><StackTrace> at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap, ColumnDescriptor columnDescriptor, Boolean isPureExpression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1250
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap, ColumnDescriptor columnDescriptor, Boolean isPureExpression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1041
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertExpressions(IBuildContext context, Expression expression, ConvertFlags queryConvertFlag, ColumnDescriptor columnDescriptor) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 809
at LinqToDB.Linq.Builder.SelectContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SelectContext.cs:line 352
at LinqToDB.Linq.Builder.SelectContext.ConvertToIndexInternal(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SelectContext.cs:line 582
at LinqToDB.Linq.Builder.SelectContext.ConvertToIndex(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SelectContext.cs:line 452
at LinqToDB.Linq.Builder.SubQueryContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SubQueryContext.cs:line 43
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap, ColumnDescriptor columnDescriptor, Boolean isPureExpression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1077
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertCompare(IBuildContext context, ExpressionType nodeType, Expression left, Expression right) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1602
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertPredicate(IBuildContext context, Expression expression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1432
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSearchCondition(IBuildContext context, Expression expression, List`1 conditions) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 2641
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildWhere(IBuildContext parent, IBuildContext sequence, LambdaExpression condition, Boolean checkForSubQuery, Boolean enforceHaving) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 50
at LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in /_/Source/LinqToDB/Linq/Builder/WhereBuilder.cs:line 25
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.cs:line 197
at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]() in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.cs:line 167
at LinqToDB.Linq.Query`1.CreateQuery(ExpressionTreeOptimizationContext optimizationContext, ParametersContext parametersContext, IDataContext dataContext, Expression expr) in /_/Source/LinqToDB/Linq/Query.cs:line 550
at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression&amp; expr, Boolean&amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/Query.cs:line 512
at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression&amp; expression, Boolean cache, Boolean&amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/ExpressionQuery.cs:line 78
at LinqToDB.Linq.ExpressionQuery`1.System.Collections.Generic.IEnumerable&lt;T&gt;.GetEnumerator() in /_/Source/LinqToDB/Linq/ExpressionQuery.cs:line 318
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at PGTest.Sample.TestBug.Run25(TestMemberEntities db) in D:\Project\C#\PGTest\Sample\TestBug.cs:line 927
at PGTest.Program.Main() in D:\Project\C#\PGTest\Program.cs:line 14</StackTrace><ExceptionString>LinqToDB.Linq.LinqException: 'value(TestMember.Models.TestMemberEntities).GetTable().Where(y =&gt; (y.StatusId == &lt;&gt;h__TransparentIdentifier0.x.Id)).FirstOrDefault().StatusName' cannot be converted to SQL.
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap, ColumnDescriptor columnDescriptor, Boolean isPureExpression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1250
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap, ColumnDescriptor columnDescriptor, Boolean isPureExpression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1041
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertExpressions(IBuildContext context, Expression expression, ConvertFlags queryConvertFlag, ColumnDescriptor columnDescriptor) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 809
at LinqToDB.Linq.Builder.SelectContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SelectContext.cs:line 352
at LinqToDB.Linq.Builder.SelectContext.ConvertToIndexInternal(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SelectContext.cs:line 582
at LinqToDB.Linq.Builder.SelectContext.ConvertToIndex(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SelectContext.cs:line 452
at LinqToDB.Linq.Builder.SubQueryContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags) in /_/Source/LinqToDB/Linq/Builder/SubQueryContext.cs:line 43
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap, ColumnDescriptor columnDescriptor, Boolean isPureExpression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1077
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertCompare(IBuildContext context, ExpressionType nodeType, Expression left, Expression right) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1602
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertPredicate(IBuildContext context, Expression expression) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 1432
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSearchCondition(IBuildContext context, Expression expression, List`1 conditions) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 2641
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildWhere(IBuildContext parent, IBuildContext sequence, LambdaExpression condition, Boolean checkForSubQuery, Boolean enforceHaving) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.SqlBuilder.cs:line 50
at LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in /_/Source/LinqToDB/Linq/Builder/WhereBuilder.cs:line 25
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.cs:line 197
at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]() in /_/Source/LinqToDB/Linq/Builder/ExpressionBuilder.cs:line 167
at LinqToDB.Linq.Query`1.CreateQuery(ExpressionTreeOptimizationContext optimizationContext, ParametersContext parametersContext, IDataContext dataContext, Expression expr) in /_/Source/LinqToDB/Linq/Query.cs:line 550
at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression&amp; expr, Boolean&amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/Query.cs:line 512
at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression&amp; expression, Boolean cache, Boolean&amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/ExpressionQuery.cs:line 78
at LinqToDB.Linq.ExpressionQuery`1.System.Collections.Generic.IEnumerable&lt;T&gt;.GetEnumerator() in /_/Source/LinqToDB/Linq/ExpressionQuery.cs:line 318
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at PGTest.Sample.TestBug.Run25(TestMemberEntities db) in D:\Project\C#\PGTest\Sample\TestBug.cs:line 927
at PGTest.Program.Main() in D:\Project\C#\PGTest\Program.cs:line 14</ExceptionString></Exception></TraceRecord>
An unhandled exception of type 'LinqToDB.Linq.LinqException' occurred in linq2db.dll
'value(TestMember.Models.TestMemberEntities).GetTable().Where(y => (y.StatusId == <>h__TransparentIdentifier0.x.Id)).FirstOrDefault().StatusName' cannot be converted to SQL.
Environment details
linq2db version: 3.5.2-rc.6775 Database: PostgreSQL 12.1 .NET Framework: 4.7.2
Issue Analytics
- State:
- Created 2 years ago
- Comments:10 (5 by maintainers)
Top Results From Across the Web
FirstOrDefault() on navigation property subquery throws ...
I want to retrieve some basic data for the "App" Along with the Last "PositionData" of that App in a single query. var...
Read more >How to query against a column that has a JSON Array in ...
I can do this easily in PSQL, but I am having issues when trying to query against a JSON Array. I tried: var...
Read more >Element Operators: First & FirstOrDefault
The First() method returns the first element of a collection, or the first element that satisfies the specified condition using lambda expression or...
Read more >Compiled Queries
FindByFirstName has a property (it could also be just a public field) called FirstName that is used to express the filter of the...
Read more >Entity Framework Core 5 - Pitfalls To Avoid and Ideas to Try
In this post, we'll look at some pitfalls and ideas EF Core users like yourself may want to consider when developing an application....
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
I have plans for next release to review this functionality. Anyway, workaround is simple:
Well, more close to original issue. But create new issue to track fix.