为项目中使用所写,根据查询实体自动生成表达式树。支持多个查询,多个字段,多个值。支持(=,like,from,to,in,(多个字段模糊匹配,使用mlike))但必须与查询实体大小写匹配。
一,建立查询实体。
public class QueryItemModel
{
/// <summary>
/// 关键字,多个key用逗号分隔
/// </summary>
public string key { get; set; }
/// <summary>
/// 值,多个value用逗号分隔
/// </summary>
public string value { get; set; }
/// <summary>
/// 匹配方式,当key用逗号分隔时,match为mlike
/// </summary>
public string match { get; set; }
}
二,建立,生成查询表达式类。
public class LambdaUtil
{
public Expression<Func<T,bool>> QueryBuilder<T>(List<QueryItemModel> propertyNames)
{
if (propertyNames == null) return null;
Type elementType = typeof(T);
string key = "";
string value = "";
string match = "";
bool IsMultipleKey = false;
ParameterExpression param = Expression.Parameter(elementType,"c");
BinaryExpression be = Expression.Equal(Expression.Constant(true), Expression.Constant(true));
foreach(var item in propertyNames)
{
if (item.value.IsEmpty() && item.key.IsEmpty() && item.match.IsEmpty()) continue;
key = item.key;
value = item.value;
match = item.match.ToLower();
List<string> LKeys = key.SplitStringToList();
if (LKeys.Count > 1) IsMultipleKey = true;
foreach(var k in LKeys)
{
PropertyInfo propertyInfo = elementType.GetProperty(k);
var proFullType = propertyInfo.PropertyType;
Type propertyType = proFullType.GenericTypeArguments.Length == 0 ? proFullType : proFullType.GenericTypeArguments[0];
var