2013-03-03 105 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

相关问题