我試圖寫具有以下特徵的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