一般如果邏輯比較簡單,只是存在有的情況多乙個查詢條件,有的情況不需要新增該查詢條件
簡單方式這樣操作就可以了
[csharp]view plain
copy
public iqueryabledynamicchainedsyntax
(iqueryablefiles, bool pastonly)
這裡的多個where條件是and關係,如果是or的關係,可將多次查詢的結果進行union
當然大多數的時候,我們是希望能夠動態構建查詢條件的,你可以針對任何字段進行任何操作符形式的查詢,不同查詢條件之間的關係也是可以動態定義的。
這裡主要說如何構建linq中where查詢條件,其實只是熟悉表示式樹的其他提供的方法,非常簡單。
[csharp]view plain
copy
public funcbool> ******comparison
string property, object value)
).compile();
}
呵呵,話到這裡,看看我的小demo
[csharp]view plain
copy
using system;
using system.collections.generic;
using system.linq;
using system.linq.expressions;
using system.text;
using system.threading.tasks;
, new person(),
new person(),
new person()};
var compareexp = ******compare("name", "daisy");
var daisys = persons.where(compareexp).tolist();
foreach (var item in daisys)
console.readkey();
} public static funcbool> ******compare(string property, object value)
} public class person
public int age
} }
再來看看查詢結果:
嗯,理解起來還是非常簡單的,就是構建表示式樹,返回我們需要的委託型別!
接下來猛料哦
動態構建表示式樹,最佳實踐版,很實用!
[csharp]view plain
copy
public class filtercollection : collection>
} public class filter
public op operation
public object value
} public enum op
通過上面的類可以動態構建複雜的查詢條件,下面具體呼叫的類哦
[csharp]view plain
copy
using infrastructure.model;
using system;
using system.collections.generic;
using system.linq;
using system.linq.expressions;
using system.reflection;
using system.text;
using system.threading.tasks;
namespace infrastructure.operation
);
private static methodinfo endswithmethod =
typeof(string).getmethod("endswith", new type );
private static expression getexpression(parameterexpression param, filter filter)
if (propertytype == typeof(datetime?))
} switch (filter.operation)
return null;
} private static binaryexpression getorexpression(parameterexpression param, filter filter1, filter filter2)
private static expression getexpression(parameterexpression param, ilistorfilters)
else if (orfilters.count == 2)
else
else
orfilters.remove(f1);
orfilters.remove(f2);
if (orfilters.count == 1)
} } return exp;
} public static expressionbool>> getexpression(filtercollection filters)
else if (filters.count == 2)
else
else
filters.remove(f1);
filters.remove(f2);
if (filters.count == 1)
} } return expression.lambdabool>>(exp, param);
} }
}
再來乙個orderby動態構建
[csharp]view plain
copy
using system;
using system.collections.generic;
using system.linq;
using system.linq.expressions;
using system.reflection;
using system.text;
namespace jurassic.sooil.com
public static iorderedqueryableorderbydescending(this iqueryablesource, string property)
public static iorderedqueryablethenby(this iorderedqueryablesource, string property)
public static iorderedqueryablethenbydescending(this iorderedqueryablesource, string property)
type delegatetype = typeof(func).makegenerictype(typeof(t), type);
lambdaexpression lambda = expression.lambda(delegatetype, expr, arg);
object result = typeof(queryable).getmethods().single(
method => method.name == methodname
&& method.isgenericmethoddefinition
&& method.getgenericarguments().length == 2
&& method.getparameters().length == 2)
.makegenericmethod(typeof(t), type)
.invoke(null, new object );
return (iorderedqueryable)result;
}
} }
至此動態構建linq查詢結束!花了上班時間一上午,還是相當值得的,不過被專案經理知道了得哭死!
不管如何,學到手的才是自己的!
查詢表示式 LINQ 簡介
在上兩篇我介紹了c 3.0新語特性和改進,這些新特性在我們編寫程式時為我們提供了非常大的幫助。從這篇開始,我們開始一起來 linq。linq是language integrated query的簡稱,它是整合在.net程式語言中的一種特性。已成為程式語言的乙個組成部分,在編寫程式時可以得到很好的編譯...
拼接linq查詢表示式
1 比如在做資料庫查詢時面對前端可能多樣的查詢條件是,有時拼接查詢條件能很方便的處理這種情況,如下 所示 public glistresultgetlist hashtable ht,int skip,int top if ht.contains roleid select select.and s...
查詢表示式 LINQ 簡介
在上兩篇我介紹了c 3.0新語特性和改進,這些新特性在我們編寫程式時為我們提供了非常大的幫助。從這篇開始,我們開始一起來 linq。linq是language integrated query的簡稱,它是整合在.net程式語言中的一種特性。已成為程式語言的乙個組成部分,在編寫程式時可以得到很好的編譯...