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.

Question: Conversion of property for queryable

See original GitHub issue

Hi , I keep pk at db as Guid. However for UI I convert them to string . If i read records from db it works but if I send results as queryble it does not works. I use odata for returning IQueryble. In nibernate I can map one column to one guid property and one formula mapping (insert:false update:false) and I can manage entity filtering and sorting actions. How I can do that with linq2db. Calculated expression not works I tried.

Exception message:
Stack trace:

LinqToDB.Linq.LinqException: Expression 'o.IdHexString' is not a Field.
   at LinqToDB.Linq.Builder.TableBuilder.TableContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags)
   at LinqToDB.Linq.Builder.SelectContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags)
   at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap, ColumnDescriptor columnDescriptor, Boolean isPureExpression)
   at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertExpressions(IBuildContext context, Expression expression, ConvertFlags queryConvertFlag, ColumnDescriptor columnDescriptor)
   at LinqToDB.Linq.Builder.SelectContext.ConvertExpressions(Expression expression, ConvertFlags flags, ColumnDescriptor columnDescriptor)
   at LinqToDB.Linq.Builder.SelectContext.ConvertMember(MemberInfo member, Expression expression, ConvertFlags flags)
   at LinqToDB.Linq.Builder.SelectContext.<>c__DisplayClass42_0.<ConvertToSql>b__3(KeyValuePair`2 m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.SelectManyIterator[TSource,TCollection,TResult](IEnumerable`1 source, Func`2 collectionSelector, Func`3 resultSelector)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.SelectContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags)
   at LinqToDB.Linq.Builder.SelectContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags)
   at LinqToDB.Linq.Builder.ExpressionBuilder.CorrectConditional(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertAssignmentArgument(IBuildContext context, Expression expr, MemberInfo memberInfo, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass79_0.<BuildExpression>b__0(Expression expr)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.CorrectConditional(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertAssignmentArgument(IBuildContext context, Expression expr, MemberInfo memberInfo, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass79_0.<BuildExpression>b__0(Expression expr)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.SelectContext.BuildQuery[T](Query`1 query, ParameterExpression queryParameter)
   at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]()
   at LinqToDB.Linq.Query`1.CreateQuery(IDataContext dataContext, Expression expr)
   at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression& expr)
   at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression& expression, Boolean cache)
   at LinqToDB.Linq.ExpressionQuery`1.GetAsyncEnumerator(CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Mvc.Infrastructure.AsyncEnumerableReader.ReadInternal[T](Object value)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncEnumerable(ActionContext context, ObjectResult result, Object asyncEnumerable, Func`2 reader)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()

Steps to reproduce


public class Operation
{
[PrimaryKey]
[Column(Name = "OPERATIONID")]
public Guid OperationId { get; set; }

[SkipValuesOnInsert(true)]
[SkipValuesOnUpdate(true)]
public string IdHexString
{
	get
	{
		return BitConverter.ToString(OperationId.ToByteArray()).Replace("-", string.Empty);
	}
}
}		
       //it works conversion is ok
	var results= snpDb
				.GetTable<Operation>()
				.ToArray();
	
	//it thows exception when client request
          return snpDb
				.GetTable<Operation>()
				.Select(o => new OperationInfo()
				{
					JobId = o.JobId,
					OperationId = o.OperationId,
					Name = o.Name,
					Description = o.Description,
					CompletedDate = o.CompleteDate,
					StartDate = o.StartDate,
					CreatedBy = o.CreatedBy,
					FailMessage = o.FailMessage,
					Progress = o.Progress,
					Status = o.Status,
					OperationIdHex = o.IdHexString
				})
				.AsQueryable();
		}

Environment details

linq2db version: 3.2.1 Database Server: oracle Database Provider: Oracle.ManagedDataAccess.Core" Version="2.19.100 Operating system: windows 10 x64 .NET Framework: .net core 3.1.404

Issue Analytics

  • State:closed
  • Created 3 years ago
  • Comments:9 (4 by maintainers)

github_iconTop GitHub Comments

1reaction
sdanylivcommented, Dec 20, 2020

You have to update extension method:

public static class MyExtensions
{
	[ExpressionMethod(ProviderName.PostgreSQL, nameof(ToHexStringImpl))]
	[Sql.Function(ProviderName.Oracle, "RAWTOHEX")]
	public static string ToHexString(this Guid guid)
	{
		return BitConverter.ToString(guid.ToByteArray()).Replace("-", string.Empty);
	}

	static Expression<Func<Guid, string>> ToHexStringImpl()
	{
		return guid => Sql.ConvertTo<string>.From(guid).Replace("-", string.Empty);
	}
}
1reaction
caliskanersincommented, Dec 19, 2020

Thank you i will check it that way

Read more comments on GitHub >

github_iconTop Results From Across the Web

How to assign a property value of an IQueryable<T>?
So the question is, how can I transform the expression tree I already have to include this extra property assignment? I have looked...
Read more >
Invalidoperationexception: the LINQ expression
Hi, I have the message System.InvalidOperationException: The LINQ expression 'DbSet<Developer>() .Where(d => d.
Read more >
Mocking IQueryable Extensions with Moq - The Seeley Coder
Inside this class I created a new List<MyModel> and populated it with a few records then converted it to an IQueryable . In...
Read more >
Queryable Extensions
This map through AutoMapper will result in a SELECT N+1 problem, as each child Course will be queried one at a time, unless...
Read more >
IQueryable Extensions working on expression for collection ...
1 Answer 1 ... Which allows me to convert lines like this: query = query.Where(x => !filter.ItemGuids.Any() || filter.ItemGuids.Contains(x.Id));.
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