是否可以向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
}
提前致谢。
答案 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中完成。如果foo
和bar
之间的转换不是那么简单,或者您想重新使用它,则可以定义该映射,而不是将IQueryable转换为IQueryable。