2011-08-08 59 views
0

我有用方法語法編寫的linq查詢。我需要創建一個非常相似的方法,只需對最終的Select進行一些更改即可。從方法返回部分linq查詢 - 如何聲明返回類型

是否有可能從一個方法返回部分Linq查詢,所以我不重複的代碼?我遇到的問題是找到查詢的「類型」來標記方法。

如果我使用query.GetType(),它返回(砍倒版):

SubSonic.Linq.Structure.Query`1[<>f__AnonymousType18`6[advert,client]] 

我試圖創建一個返回類型:不過,我收到錯誤

SubSonic.Linq.Structure.Query<advert, client> query = new SubSonic.Linq.Structure.Query<advert, client>(); 

Error 20 Using the generic type 'SubSonic.Linq.Structure.Query<T>' requires '1' type arguments 

所以我想我問如何聲明返回類型是一個Subsonic查詢公司獲取包含多個對象的匿名類型?(2在我的例子)

請原諒我的簡單的例子:

如:

internal ????? GetQueryBody(string param1, string param2){ 
    /* buld the linq query here */ 
} 

internal List<Booking> GetSearchResultsOne(string param1, string param2){ 
    var query = this.GetQueryBody(string param1, string param2); 
    var res = query.Select(db => new Booking { /*fields */).ToList(); 
    return res; 
} 

internal List<BookingData> GetSearchResultsTwo(string param1, string param2){ 
    var query = this.GetQueryBody(string param1, string param2); 
    var res = query.Select(db => new BookingData { /*fields*/).ToList(); 
    return res; 
} 

謝謝您的時間,

Yohimbo

+2

假設我說得對,它可以是IQueryable ? – twoflower

+0

重新使用:「IQueryable 」。我想這是我的問題 - WhateverTheQueryIsOperatingOn是一個包含2個對象的匿名對象。我將如何表達? IQueryable >? – Yohimbo

回答

1

使用IEnumerable<T>返回一個查詢。

關於匿名類型:如果一個類型是匿名的,另一個方法應該如何知道它?閱讀更多here。爲了解決這個問題,通過創建一個類給你的匿名類型一個名字。

如果你只想返回兩種類型,你也可以返回一個元組:TTuple<advert,client>。您可以通過

var t = new Tuple<advert,client>(client, advert); 
+0

我嘗試使用IQueryable作爲返回類型,但是,編譯器說:**「Error 'System.Linq.IQueryable'不包含'Select'的定義並且沒有擴展方法'Select'接受第一個參數可以找到類型'System.Linq.IQueryable'「** – Yohimbo

+0

重新使用:」IEnumerable 「。我想這就是我的問題 - T是一個包含2個對象的匿名對象。我將如何表達?像IEnumerable >? – Yohimbo

+0

回覆:「關於匿名類型」鏈接。我不能創建一個類來包裝它 - 這就是Subsonic Linq提供程序在執行query.GetType()時返回的結果:「SubSonic.Linq.Structure.Query'1 [<> f__AnonymousType18'6 [advert,client]]」。 ..感謝您的幫助,雖然 – Yohimbo

0

回答1創建一個元組:你不能這樣做,因爲預訂和BookingData是不同的類型,因此表達式樹是不同的。

答案2:假設你可以找到一個通用的基類,你的問題有兩種方法。

  1. Linq查詢所作用的'類型'實際上是一個表達式。您可以構建Expression樹並存儲並操作它們,然後在需要的地方使用它們。

  2. 您的最終Select()的'參數'實際上是一個Expression>。只要符合該委託,您就可以在該位置使用任何功能。

換句話說,您可以從頂部存儲整個預先構建的表達式樹,也可以存儲一棵樹並將其替換爲底部的位。您的示例中沒有足夠的內容來編寫代碼,您仍然必須解決這個致命缺陷。