DynamicQueryable
DynamicQueryable copied to clipboard
Exception with null checks on a non nullable integer
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.'