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

Methods on type 'JsonElement' are not accessible'. #410

Closed
Chauhan225 opened this issue Aug 16, 2020 · 3 comments
Closed

Methods on type 'JsonElement' are not accessible'. #410

Chauhan225 opened this issue Aug 16, 2020 · 3 comments
Assignees
Labels

Comments

@Chauhan225
Copy link

Chauhan225 commented Aug 16, 2020

Following code through's error:

List<Item> i = db.Item.Where("x => x.JsonData.GetProperty(\"Name\").GetString().Equals(\"input\")").ToList();
Following code without dynamic predicate works fine:
List<Item> i = db.Item.Where(x => x.JsonData.GetProperty("Name").GetString().Equals("input")).ToList();

Item Class:
 public class Item
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public JsonElement JsonData { get; set; }
    }

Stack Trace:
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMemberAccess(Type type, Expression instance)
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimary()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseUnary()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMultiplicative()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAdditive()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseShiftOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseComparisonOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLogicalAndOrOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIn()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAndOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseOrOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLambdaOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseNullCoalescingOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseConditionalOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMemberAccess(Type type, Expression instance)
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIdentifier()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimaryStart()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimary()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseUnary()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMultiplicative()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAdditive()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseShiftOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseComparisonOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLogicalAndOrOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIn()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAndOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseOrOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLambdaOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseNullCoalescingOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseConditionalOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.Parse(Type resultType, Boolean createParameterCtor)
at System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(ParsingConfig parsingConfig, Boolean createParameterCtor, ParameterExpression[] parameters, Type resultType, String expression, Object[] values)
at System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(ParsingConfig parsingConfig, Boolean createParameterCtor, Type itType, Type resultType, String expression, Object[] values)
at System.Linq.Dynamic.Core.DynamicQueryableExtensions.Where(IQueryable source, ParsingConfig config, String predicate, Object[] args)
at System.Linq.Dynamic.Core.DynamicQueryableExtensions.Where[TSource](IQueryable1 source, ParsingConfig config, String predicate, Object[] args) at System.Linq.Dynamic.Core.DynamicQueryableExtensions.Where[TSource](IQueryable1 source, String predicate, Object[] args)
at EfCorePostgresql.Program.Main(String[] args) in D:\SB\Learning\EfCorePostgresql\EfCorePostgresql\Program.cs:line 109

@JonathanMagnan JonathanMagnan self-assigned this Aug 16, 2020
@JonathanMagnan
Copy link
Member

Hello @Chauhan225 ,

Thank you for reporting, we will look at it.

Best Regards,

Jon


Performance Libraries
context.BulkInsert(list, options => options.BatchSize = 1000);
Entity Framework ExtensionsEntity Framework ClassicBulk OperationsDapper Plus

Runtime Evaluation
Eval.Execute("x + y", new {x = 1, y = 2}); // return 3
C# Eval FunctionSQL Eval Function

@JonathanMagnan
Copy link
Member

Hello @Chauhan225 ,

Sorry for the delay,

Here is what my developer suggest you, to create a method on your side to support it:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Dynamic.Core;
using System.Linq.Dynamic.Core.CustomTypeProviders;
using System.Text.Json;

namespace Z.Dynamic.Core.Lab
{
    public class Template_Simple
    {
        [DynamicLinqType]
        public static class Utils
        { 
            public static string GetPropertyGetString(JsonElement jsonElement, string name)
            {
                return jsonElement.GetProperty("Name").GetString();
            }

        }
        public class Item
        {
            public long Id { get; set; }
            public string Name { get; set; }
            public string Description { get; set; }
            public JsonElement JsonData { get; set; }
        }


        public static void Execute()
        {
            JsonDocument doc = JsonDocument.Parse(" { \"Name\": \"ZZZ\" }  ");
            List<Item> customers = new List<Item>() {new Item() { JsonData = doc.RootElement } };

            var t = customers.First().JsonData.GetProperty("Name").GetString();
            var query = customers.AsQueryable()
                .Where("x => Utils.GetPropertyGetString( x.JsonData, \"Name\") == @0  ", "ZZZ" ).ToDynamicList();  
        }
    }
}

We might support it eventually directly built-in in the library but at this moment, we have no plan for it.

@abbasc52
Copy link
Contributor

abbasc52 commented Apr 9, 2022

@Chauhan225 and anyone else who is looking for an alternate solution. It seems adding the type 'JsonElement' to CustomTypeProvider in parserConfig fixed this issue for me.

public class MyCustomTypeProvider : DefaultDynamicLinqCustomTypeProvider
{
    public override HashSet<Type> GetCustomTypes() =>
        new[] { typeof(JsonElement) }.ToHashSet();
}

var config = new ParsingConfig
{
    CustomTypeProvider = new MyCustomTypeProvider()
}

List<Item> i = db.Item.Where(config,"x => x.JsonData.GetProperty(\"Name\").GetString().Equals(\"input\")").ToList();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

4 participants