2013-10-15 77 views
1

鑑於以下LINQ語句,有人能告訴我是否有可能將select部分重構爲表達式樹?我之前沒有使用過表達式樹,也沒能找到關於Selects的很多信息。注意,這將被轉換爲SQL並在SQL Server中運行,而不是在內存中運行。如何重構LINQ select語句

var results = db.Widgets 
    .Select(w => new 
    { 
     Name = (w is x) ? "Widget A" : "Widget B" 
    }); 

我希望能夠做到這一點..

var name = [INSERT REUSABLE EXPRESSION] 
var somethingElse = [INSERT REUSABLE EXPRESSION] 
var results = db.Widgets.Select(w => new { Name = name, SomethingElse = somethingElse }); 

顯然預期用途是用於更復雜的語句。

+0

所以'WidgetType'是一個字符串?你想將一個表達式分配給一個字符串?或者你想讓WidgetType成爲一個表達式。 –

+0

@JeroenvanLangen WidgetType只是一個字符串。我試圖找到一種方法來重構我的LINQ代碼中常用的select語句 – Grant

+0

據我所知'Expression'與'delegate'非常相似,區別在於它用於將客戶端的邏輯轉換爲SQL查詢服務器,在那裏執行查詢並將結果返回**,所以你寫的代碼是非常奇怪的,並且很難實現,至少你必須遵循將委託或表達式傳遞給方法。 –

回答

0

您可以使用LinqKit來做到這一點。只要您的方法可以轉換爲SQL,它就會工作。這基本上是一個完整的例子可能是什麼樣子:

public static class ReusableMethods 
{ 
    public static Expression<Func<int, Person>> GetAge() 
    { 
     return p => p.Age; 
    } 
} 

var getAge = ReusableMethods.GetAge(); 
var ageQuery = from p in People.AsExpandable() 
       select getAge.Invoke(p); 

需要注意的是:

  1. 您需要添加AsExpandable()到您的IQueryable。
  2. 在使用它之前,您必須將您的方法分配給局部變量(不確定確切的原因,但它的必須)。