我试图写具有以下特征的ServiceStack.OrmLite.SqlExpressionVisitor通用通配符搜索:LINQ的扩展表达式
public static SqlExpressionVisitor<T> WhereWildcardSearch<T> (this SqlExpressionVisitor<T> ev, Expression<Func<T,string>> field, string search)
其中EV是过滤器的其余部分,字段是吸气搜索和搜索的字段是输入的字词。
通常情况下(非通用),我会写:
if(search.StartsWith('*') && search.EndsWith('*'))
ev = ev.Where(x => x.foo.Contains(search.Trim('*')));
当然,也可用于x.foo.StartsWith或变种的endsWith。
现在我正在寻找类似的信息(伪代码:)
ev = ev.Where(x => field(x).Contains(search.Trim('*')));
当然,我不能编译并直接调用的表达,因为这应该使用LINQ2SQL转换为SQL。
这是到目前为止我的代码:
var getFieldExpression = Expression.Invoke (field, Expression.Parameter (typeof (T), "getFieldParam"));
var searchConstant = Expression.Constant (search.Trim('*'));
var inExp = Expression.Call (getFieldExpression, typeof(String).GetMethod("Contains"), searchConstant);
var param = Expression.Parameter (typeof (T), "object");
var exp = Expression.Lambda<Func<T, bool>> (inExp, param);
ev = ev.Where (exp);
请不要告诉我,我应该直接写SQL与$"LIKE %search%"
什么的 - 我知道还有其他方法,但解决这将有助于我的理解一般的Linq和Expressions,当我解决不了它时,它会让我感到不适。
这工作良好,正是我所要求的。谢谢! 只是进一步的问题:这只会在Field-Getter表达式通过时才起作用(就像我问的那样)。是否有一个易于修改,可以用于任何表达式>? (假设给定的表达式在linq2sql中是有效的) –
KillPinguin
@KillPinguin我已经更新了答案,以澄清这一点 – Evk
现在明白了。谢谢! – KillPinguin