【发布时间】:2020-01-16 18:26:57
【问题描述】:
我有一个初始工作流程,允许我对 IQueryable 中包含的对象的字符串属性执行包容性搜索:
public static IQueryable ApplySearch(this IQueryable queryable, string search)
{
// validation omitted for brevity
var expression = queryable
.Cast<object>()
.Where(item => item.SearchStringTree(search))
.Expression;
var result = queryable.Provider.CreateQuery(expression);
return result;
}
static bool SearchStringTree<T>(this T value, string search) =>
value.GetObjectStrings().Any(s => s.Contains(search.ToLower()));
static IEnumerable<string> GetObjectStrings<T>(this T value)
{
var strings = new List<string>();
var properties = value.GetType()
.GetProperties()
.Where(x => x.CanRead);
foreach (var prop in properties)
{
var t = prop.PropertyType.ToString().ToLower();
var root = t.Split('.')[0];
if (t == "system.string")
{
strings.Add(((string)prop.GetValue(value)).ToLower());
}
else if (!(root == "system"))
{
strings.AddRange(prop.GetValue(value).GetObjectStrings());
}
}
return strings;
}
是否有可能以实体框架可以在 DbContext 执行之前进行转换的方式应用此概念?
我一直在研究可能使用 Expression Trees 来完成此任务。
这是一个有效的Repl.it,显示了上面的IQueryable 实现。
【问题讨论】:
标签: c# .net-core entity-framework-core