DynamicQueryable icon indicating copy to clipboard operation
DynamicQueryable copied to clipboard

Exception with null checks on a non nullable integer

Open hidegh opened this issue 5 years ago • 0 comments

DynamicQueryable version

2.0.25

Steps to reproduce

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic;

namespace DynamicQueryable.Nesting
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int? Number { get; set; }
        public Address Address { get; set; }
        public Person()
        {
            Address = new Address();
        }
    }

    public class Address
    {
        public string City { get; set; }
        public int Zip { get; set; }
        public int? Number { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Req.
            // DynamicQueryable 2.0.25
            // Jokenizer 1.1.1
            var searchText = "1";
            var data = new List<Person>()
            {
                new Person() { Name = "proof search 1 me" },
                new Person() { Name = "This has age 1", Age = 1 },
                new Person() { Name = "This has non null number 1", Number = 1 },
                new Person() { Name = "This address has zip 1", Address = new Address() { Zip = 1 } },
                new Person() { Name = "This address has non numm number 1", Address = new Address() { Number = 1 } }
            };

            var r1 = data.AsQueryable().Where($"i => i.Name != null && i.Name.Contains(\"{searchText}\")").ToList();
            var r1p = data.AsQueryable().Where("i => i.Name != null && i.Name.Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();

            var r1Ordered = r1.AsQueryable().OrderByDescending("i=> i.Name").ToList();

            // nullable vs non nullable int
            var r2p = data.AsQueryable().Where("i => i.Age != null && i.Age.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();
            var r2np = data.AsQueryable().Where("i => i.Number != null && i.Number.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();

            // nested nullable vs non nullable int
            var r3p = data.AsQueryable().Where("i => i.Address != null && i.Address.Zip != null && i.Address.Zip.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();
            var r3np = data.AsQueryable().Where("i => i.Address != null && i.Address.Number != null && i.Address.Number.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();

            Console.WriteLine("Hello World!");
        }

    }
}


Expected behavior

Same as with standard .NET System.Dynamic.Linq.Core

using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;

namespace System.Linq.Dynamic
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int? Number { get; set; }
        public Address Address { get; set; }
        public Person()
        {
            Address = new Address();
        }
    }

    public class Address
    {
        public string City { get; set; }
        public int Zip { get; set; }
        public int? Number { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var searchText = "1";
            var data = new List<Person>()
            {
                new Person() { Name = "proof search 1 me" },
                new Person() { Name = "This has age 1", Age = 1 },
                new Person() { Name = "This has non null number 1", Number = 1 },
                new Person() { Name = "This address has zip 1", Address = new Address() { Zip = 1 } },
                new Person() { Name = "This address has non numm number 1", Address = new Address() { Number = 1 } }
            };

            var r1 = data.AsQueryable().Where($"i => i.Name != null && i.Name.Contains(\"{searchText}\")").ToList();
            var r1p = data.AsQueryable().Where("i => i.Name != null && i.Name.Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();

            var r1Ordered = r1.AsQueryable().OrderBy("i=> i.Name descending").ToList();

            // nullable vs non nullable int
            var r2p = data.AsQueryable().Where("i => i.Age != null && i.Age.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();
            var r2np = data.AsQueryable().Where("i => i.Number != null && i.Number.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();

            // nested nullable vs non nullable int
            var r3p = data.AsQueryable().Where("i => i.Address != null && i.Address.Zip != null && i.Address.Zip.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();
            var r3np = data.AsQueryable().Where("i => i.Address != null && i.Address.Number != null && i.Address.Number.ToString().Contains(searchText)", new Dictionary<string, object> { { "searchText", searchText } }).ToList();

            Console.WriteLine("Hello World!");
        }

    }
}

Actual behavior

System.NullReferenceException: 'Object reference not set to an instance of an object.'

hidegh avatar May 18 '20 10:05 hidegh