最近在做動態構造linq語句,從網上找了很多,大多數,都是基於一張表中的某一個字段,這樣的結果,從網上可以搜到很多。但如果有外鍵表,需要動態構造外鍵表中的字段,那么問題來了,學挖掘機哪家強?哦,不是,應該怎么做呢。
關於動態構造linq的,http://www.cnblogs.com/blusehuang/archive/2007/07/13/816970.html 該文章已經描述的很清楚了。我也不多說了。
其中,關鍵的代碼是:
Expression con = Expression.Call( Expression.Property(c, typeof(T).GetProperty(key)), typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), Expression.Constant(parameters[key]) );
當我們有一張表,如下:
public class Test{ public int A{get;set;} public string B{get;set;} public Test2 T2 {get;set;} }
還有Test2表:
public class Test2{ public int Id{get;set;} public string Name{get;set;} }
要從Test表中查詢到Test2表中的linq語句,是這樣寫的。
DBContext.Entities.Where(x=>x.T2.Name.Contains("a"));
那么,問題來了,學挖掘機哪家強呢?額,不對,轉成動態的如何轉呢???
單個動態構造還是清晰易懂的,
Expression.Property(c, typeof(T).GetProperty(key))
這句代碼表示,讀取Test類型下的某個字段,這里應該是是Test2,那我們改成:
Expression.Property(c, typeof(Test1).GetProperty(Test2))
恩,對了,思路正確,下一部就比較關鍵了,我要繼續查找T2下的Name屬性該如何操作呢??再我調試了之后,發現了一個秘密。。
最終的代碼:
var member = Expression.Property(c, typeof(Test).GetProperty("T2")); var member2 = Expression.Property(member, typeof(Test2).GetProperty("Name")); Expression con = Expression.Call( member2, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), Expression.Constant("a") );
這樣,其linq表達式生成的代碼就是c=>c.T2.Name.Contains("a") 了。 是不是so easy,解決了兩張表的關聯,其他的問題就好說了,如果還不知道的話,請將自己敲個示例,F5調試。不成功,遍成人。。
不用謝我,我叫紅領巾。。