動態拼接linq 使用Expression構造動態linq語句


最近在做動態構造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調試。不成功,遍成人。。

不用謝我,我叫紅領巾。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM