c 表示式樹在LINQ動態查詢

2021-09-25 23:40:07 字數 4384 閱讀 1506

一般如果邏輯比較簡單,只是存在有的情況多乙個查詢條件,有的情況不需要新增該查詢條件

簡單方式這樣操作就可以了

[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程式語言中的一種特性。已成為程式語言的乙個組成部分,在編寫程式時可以得到很好的編譯...