2013-03-03 108 views
0

是否可以將擴展方法添加到將其轉換爲另一種類型的IQueryable的IQueryable?IQueryable <T1>將轉換爲IQueryable的擴展方法<T2>

我在找這樣的東西;

IQueryable<foo> source; 
IQueryable<bar> result = source.Convert<bar>(); 

我有這個,顯然它不工作。 LOL

public static IQueryable<T1> Convert<T2>(this IQueryable<T1> source) where T1 : class 
{ 
    // Do some stuff 
} 

在此先感謝。

回答

6

當然,它已經在Select - 你只需要提供轉換。例如,通過採取長度的IQueryable<string>轉換爲IQueryable<int>

IQueryable<string> source = ...; 
IQueryable<int> lengths = source.Select(x => x.Length); 
+0

嗨,喬恩。謝謝回覆。之所以我想這是一個擴展方法是因爲我不想重複相同的選擇代碼。我打算使用它將我的模型轉換爲視圖模型。我應該看看automapper嗎? – 2013-03-03 19:51:51

+0

@PlatypusMaximus:但是'Select'已經是一種擴展方法。你還沒有給我們提供任何關於你如何期望將'T1'轉換爲'T2'的信息......當然,提供這些信息將使其等同於'Select'。 – 2013-03-03 19:53:45

+0

我在考慮在Convert擴展方法中,我可以通過IQueryable中的項目,並通過將T1傳遞給構造函數來創建T2的實例 - 但我只是發現我不能只在這個方法中新增一個T2像新的T2(T1)。我會與您的答案一起前進,接着挑戰下一個挑戰。非常感謝答案,祝你有美好的一天。 – 2013-03-03 20:09:41

1

你回到同一類型(IQueryable<T1>)您在原可查詢的有,所以你的擴展方法是服用IQueryable<foo>並返回IQueryable<foo>,您想要返回IQueryable<bar>。此外,您將T2定義爲泛型類型參數,但不是T1。你可以改成這樣:

public static IQueryable<T2> Convert<T1, T2>(IQueryable<T1> source) where T1 : class 
{ 
... 
} 

然後調用,像這樣:

IQueryable<Bar> result = source.Convert<Foo, Bar>(); 

但是...作爲喬恩指出,這可能是在選擇完成。如果foobar之間的轉換不是那麼簡單,或者您想重新使用它,您可以定義該映射,而不是將IQueryable轉換爲IQueryable。

+0

非常感謝SimonC。我決定和Jon的回答一起去,但是我會把你的代碼保存爲一個片段,以防我需要它來做別的事情。祝你今天愉快! :) – 2013-03-03 20:07:50

相關問題