Question: Conversion of property for queryable
See original GitHub issueHi , 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:
- Created 3 years ago
- Comments:9 (4 by maintainers)
Top 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 >
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
You have to update extension method:
Thank you i will check it that way