IQueryable <t1>转换为IQueryable的扩展方法<t2> </t2> </t1>

时间:2013-03-03 19:27:56

标签: c# iqueryable generic-collections

是否可以向IQueryable添加扩展方法,将其转换为另一种类型的IQueryable?

我正在寻找类似的东西;

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
}

提前致谢。

2 个答案:

答案 0 :(得分:6)

肯定它已经在Select - 你只需要提供转换。例如,要通过获取长度将IQueryable<string>转换为IQueryable<int>

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

答案 1 :(得分: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>();

但是......正如Jon指出的那样,这可以在Select中完成。如果foobar之间的转换不是那么简单,或者您想重新使用它,则可以定义该映射,而不是将IQueryable转换为IQueryable。