2011-03-07 122 views
0

誰能這種簡單的LINQ到SQL轉換爲表達式樹:轉換LINQ到SQL表達式表達式樹

List<Region> lst = (from r in dc.Regions 
        where r.RegionID > 2 && r.RegionDescription.Contains("ern") 
        select r).ToList(); 

回答

5

這應做到:

var query = dc.Regions.AsQueryable(); 

ParameterExpression pe = Expression.Parameter(typeof(Region), "region"); 

Expression id = Expression.PropertyOrField(pe, "RegionID"); 
Expression two = Expression.Constant(2); 
Expression e1 = Expression.GreaterThan(id, two); 

Expression description = Expression.PropertyOrField(pe, "RegionDescription"); 
MethodInfo method = typeof(string).GetMethod("Contains", new[] {typeof(string)}); 
Expression ern = Expression.Constant("ern",typeof(string)); 
Expression e2 = Expression.Call(description, method, ern); 

Expression e3 = Expression.And(e1, e2); 

MethodCallExpression whereCallExpression = Expression.Call(
       typeof(Queryable), 
       "Where", 
       new Type[] { query.ElementType }, 
       query.Expression, 
       Expression.Lambda<Func<Region, bool>>(e3, new ParameterExpression[] { pe })); 
var results = query.Provider.CreateQuery<Region>(whereCallExpression); 

List<Region> lst = results.ToList(); 

而且只選擇RegionID從結果集執行以下操作:

MethodCallExpression selectExpression = Expression.Call(
           typeof(Queryable),         
           "Select", 
           new[]{ typeof(Region), typeof(int)}, 
           whereCallExpression, 
           Expression.Lambda<Func<Region, int>>(id, pe)); 

var regionIDsQuery = query.Provider.CreateQuery<int>(selectExpression); 

List<int> regionIDs = regionIDsQuery.ToList(); 
+0

非常感謝。可以介紹一些關於Expression Tree的文章嗎?你是表達樹的主人嗎?謝謝 – Arian 2011-03-08 04:51:48

+0

請編輯你的文章,並用「ern」替換「widget」。你可以告訴我,如果我只想選擇「RegionID」,我該怎麼做。謝謝 – Arian 2011-03-08 05:26:54

+0

@Nima很高興我能幫忙。謝謝你這麼說,但我不是'Expression Trees'的主人。它們只是一個有趣的結構,我一般都會更好地理解'Linq'。我建議閱讀課程的文檔,但也要編寫一些標準的'Linq'查詢,然後檢查它們的'Expression'屬性。一點一點地這將幫助你瞭解潛在的機制。我會更新我的答案以包含「選擇」呼叫。 – Sorax 2011-03-08 15:21:52