question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

PostgreSQL Test Problem Where filter using let var FirstOrDefault()

See original GitHub issue
Model
	[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 =&amp;gt; (y.StatusId == &amp;lt;&amp;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;amp; expr, Boolean&amp;amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/Query.cs:line 512
   at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression&amp;amp; expression, Boolean cache, Boolean&amp;amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/ExpressionQuery.cs:line 78
   at LinqToDB.Linq.ExpressionQuery`1.System.Collections.Generic.IEnumerable&amp;lt;T&amp;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 =&amp;gt; (y.StatusId == &amp;lt;&amp;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;amp; expr, Boolean&amp;amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/Query.cs:line 512
   at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression&amp;amp; expression, Boolean cache, Boolean&amp;amp; dependsOnParameters) in /_/Source/LinqToDB/Linq/ExpressionQuery.cs:line 78
   at LinqToDB.Linq.ExpressionQuery`1.System.Collections.Generic.IEnumerable&amp;lt;T&amp;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:open
  • Created 2 years ago
  • Comments:10 (5 by maintainers)

github_iconTop GitHub Comments

1reaction
sdanylivcommented, Oct 26, 2021

I have plans for next release to review this functionality. Anyway, workaround is simple:

var query = 
    (from x in db.TableName
    from status in db.TableStatus.Where(y => y.StatusId == x.Id)
        .Take(1)
        .DefaultIfEmpty()
    select new
    {
        Id = (int?)status.StatusId ?? x.Id,
        StatusName = status.StatusName ?? "abc",
    })
    .Where(x => x.StatusName == "abc");

0reactions
sdanylivcommented, Nov 13, 2021

Well, more close to original issue. But create new issue to track fix.

Read more comments on GitHub >

github_iconTop 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 >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found