support for method calls on string, this would help database drivers like mongo or even other database that have a string collation that is case sensitive.
This commit is contained in:
parent
e7a3b0692e
commit
15aeb2a1a1
@ -30,6 +30,70 @@ namespace PoweredSoft.DynamicLinq.Test
|
|||||||
Assert.IsTrue(newQuery.Any(), "Must have at least one author that matches");
|
Assert.IsTrue(newQuery.Any(), "Must have at least one author that matches");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void EqualLowerCase()
|
||||||
|
{
|
||||||
|
// subject.
|
||||||
|
var authors = new List<Author>()
|
||||||
|
{
|
||||||
|
new Author { Id = long.MaxValue, FirstName = "David", LastName = "Lebee" }
|
||||||
|
};
|
||||||
|
|
||||||
|
// the query.
|
||||||
|
var query = authors.AsQueryable();
|
||||||
|
|
||||||
|
// simple where.
|
||||||
|
var newQuery = query.Where("FirstName.ToLower()", ConditionOperators.Equal, "david");
|
||||||
|
|
||||||
|
// must match.
|
||||||
|
Assert.IsTrue(newQuery.Any(), "Must have at least one author that matches");
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void EqualLowerCaseNullCheck()
|
||||||
|
{
|
||||||
|
// subject.
|
||||||
|
var authors = new List<Author>()
|
||||||
|
{
|
||||||
|
new Author { Id = long.MaxValue, FirstName = null, LastName = "Lebee" },
|
||||||
|
new Author { Id = long.MaxValue, FirstName = "David", LastName = "Lebee" },
|
||||||
|
};
|
||||||
|
|
||||||
|
// the query.
|
||||||
|
var query = authors.AsQueryable();
|
||||||
|
|
||||||
|
// simple where.
|
||||||
|
var newQuery = query.Where(wb =>
|
||||||
|
{
|
||||||
|
wb.Equal("FirstName.ToLower()", "david").NullChecking(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
// must match.
|
||||||
|
Assert.IsTrue(newQuery.Any(), "Must have at least one author that matches");
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void DoubleMethodCheck()
|
||||||
|
{
|
||||||
|
// subject.
|
||||||
|
var authors = new List<Author>()
|
||||||
|
{
|
||||||
|
new Author { Id = long.MaxValue, FirstName = "David ", LastName = "Lebee" },
|
||||||
|
};
|
||||||
|
|
||||||
|
// the query.
|
||||||
|
var query = authors.AsQueryable();
|
||||||
|
|
||||||
|
// simple where.
|
||||||
|
var newQuery = query.Where(wb =>
|
||||||
|
{
|
||||||
|
wb.Equal("FirstName.Trim().ToLower()", "david").NullChecking(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
// must match.
|
||||||
|
Assert.IsTrue(newQuery.Any(), "Must have at least one author that matches");
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void Contains()
|
public void Contains()
|
||||||
{
|
{
|
||||||
|
@ -3,6 +3,7 @@ using PoweredSoft.DynamicLinq.Parser;
|
|||||||
using PoweredSoft.DynamicLinq.Resolver;
|
using PoweredSoft.DynamicLinq.Resolver;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
@ -471,8 +472,18 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
|||||||
var partStr = parts.First();
|
var partStr = parts.First();
|
||||||
var isLast = parts.Count == 1;
|
var isLast = parts.Count == 1;
|
||||||
|
|
||||||
|
Expression memberExpression;
|
||||||
|
if (current != null && current.Type == typeof(string) && partStr.Contains("()"))
|
||||||
|
{
|
||||||
|
var finalMethodName = partStr.Replace("()", string.Empty);
|
||||||
|
var callingMethod = GetStringCallingMethod(finalMethodName); //typeof(string).GetMethod(finalMethodName, new Type[0]);
|
||||||
|
memberExpression = Expression.Call(current, callingMethod);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// the member expression.
|
// the member expression.
|
||||||
var memberExpression = Expression.PropertyOrField(current, partStr);
|
memberExpression = Expression.PropertyOrField(current, partStr);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO : maybe support that last part is collection but what do we do?
|
// TODO : maybe support that last part is collection but what do we do?
|
||||||
// not supported yet.
|
// not supported yet.
|
||||||
@ -535,7 +546,19 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Expression InAndNotIn(ParameterExpression parameter, ConditionOperators condition, object value, QueryConvertStrategy convertStrategy, MemberExpression memberExpression)
|
private static ConcurrentDictionary<string, MethodInfo> _stringMethodCache = new ConcurrentDictionary<string, MethodInfo>();
|
||||||
|
private static MethodInfo GetStringCallingMethod(string methodName)
|
||||||
|
{
|
||||||
|
if (methodName == null)
|
||||||
|
throw new ArgumentNullException(nameof(methodName));
|
||||||
|
|
||||||
|
return _stringMethodCache.GetOrAdd(methodName, mn =>
|
||||||
|
{
|
||||||
|
return typeof(string).GetMethod(mn, new Type[0]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Expression InAndNotIn(ParameterExpression parameter, ConditionOperators condition, object value, QueryConvertStrategy convertStrategy, Expression memberExpression)
|
||||||
{
|
{
|
||||||
var enumerableValue = value as IEnumerable;
|
var enumerableValue = value as IEnumerable;
|
||||||
if (enumerableValue == null)
|
if (enumerableValue == null)
|
||||||
|
Loading…
Reference in New Issue
Block a user