EF6没有内置的Like方法,可以使用以下自定义方法代替生成
/// <summary>
/// 应用全局关键字搜索(多字段OR连接的模糊搜索)
/// </summary>
private IQueryable<TEntity> ApplyGlobalKeywordSearch(IQueryable<TEntity> query, string keyword, List<string> propertyNames)
{
if (string.IsNullOrEmpty(keyword) || propertyNames == null || !propertyNames.Any())
return query;
ParameterExpression parameter = Expression.Parameter(typeof(TEntity), "x");
Expression combinedExpression = null;
// 通配符包裹
string likePattern = "%" + keyword + "%";
ConstantExpression likePatternExpression = Expression.Constant(likePattern, typeof(string));
foreach (string propertyName in propertyNames)
{
PropertyInfo property = typeof(TEntity).GetProperty(propertyName,
BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (property == null || property.PropertyType != typeof(string))
continue;
MemberExpression propertyAccess = Expression.Property(parameter, property);
// EntityFunctions.Like(x.Property, "%keyword%")
MethodInfo likeMethod = typeof(DbFunctions).GetMethod("Like", new[] { typeof(string), typeof(string) });
var likeExpression = Expression.Call(
likeMethod,
propertyAccess,
likePatternExpression
);
if (combinedExpression == null)
{
combinedExpression = likeExpression;
}
else
{
combinedExpression = Expression.OrElse(combinedExpression, likeExpression);
}
}
if (combinedExpression == null)
return query;
var lambda = Expression.Lambda<Func<TEntity, bool>>(combinedExpression, parameter);
return query.Where(lambda);
}
可生成SQL语句中的 Like % keyword %


