我的WCF數據服務(三)勝利

這個問題解決起來還頗費了一些周章。在搜索解決方案的時候,發現了這篇文章:http://blog.csdn.net/heshengfen123/article/details/17301079
和我遇到了同樣的問題。作者使用了 Dynamic Expression API 這個組件解決了問題,我也按照文章上說的下載了這個組件,放到了項目裏,於是代碼變成了這樣:

int i = 3,rc;
var q = System.Linq.Dynamic.DynamicExpression.ParseLambda<XXX, bool>("id>@0", i);
var l = BLL.XXX.GetList(30,1,q,x=>x.id,true,out rc);

運行又可以了,但是當我需要按字符串查詢的時候,又不行了,我本來要這樣:

int rc;
string s = "中";
var l = BLL.XXX.GetList(30,1,x=>x.name.Contains(s),x=>x.id,true,out rc);
可是 System.Linq.Dynamic.DynamicExpression.ParseLambda<XXX, bool>("name.Contains(\" + s + "\""); 

這樣會報錯。
我不明白是怎麼回事,於是研究起 Dynamic Expression API 這個組件的源代碼,發現只實現了 = < > 等這樣符號的運算。這樣的話基本上在生產環境是沒法用的。不過我在研究的過程中學到了不少 Expression 相關的知識,然後就想想有什麼樣的解決辦法。我想,既然他們能動態的生成一個表達式,那我也能啊,我生成完再組合起來,也一樣用啊。於是我照着他們的代碼,自己寫了一些建立表達式樹的輔助方法。

public static Expression<Func<T, bool>> ToExpressionContainsMe<T>(this string s, Expression<Func<T, string>> keySelector)
        {
            MethodCallExpression met = Expression.Call(keySelector.Body, typeof(string).GetMethod("Contains"), Expression.Constant(s));
            Expression<Func<T, bool>> lamb = Expression.Lambda<Func<T, bool>>(met, keySelector.Parameters);
            return lamb;
        }

public static Expression<Func<T, bool>> ToExpressionEqual<T>(this int i, Expression<Func<T,int>> keySelector)
        {
            return Expression.Lambda<Func<T, bool>>(Expression.Equal(Expression.Constant(i), keySelector.Body), keySelector.Parameters);
        }

這裏舉兩個例子,別的都是大同小異的。又從網上抄了段能 And Or 組合表達式的代碼,我不放這了,請自己去搜。
於是代碼成了這樣:

int i=3,j=100,rc;
Expression<Func<Model.XXX,bool>> q = i.ToExpressionGreaterThanMe(x=>x.id);
q = q.And(j.ToExpressionLessThanMe(x=>x.id));
string s = "中";
q = q.And(s.ToExpressionContainsMe(x=>x.name));
var l = BLL.XXX.GetList(30,1,q,x=>x.id,true,out rc);

這樣就成功了,完全可以用到生產環境了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章