【发布时间】:2011-01-28 00:34:00
【问题描述】:
注意_src继承IQueryable<U>,V继承new();
我写了以下语句,没有语法错误。
IQueryable<V> a = from s in _src where (s.Right - 1 == s.Left) select new V();
但如果我重新编写如下,Visual Studio 编辑器会在“选择”中报错
IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(s=> new V());
错误是:
The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly.
Candidates are:
System.Collections.Generic.IEnumerable<V> Select<U,V>(this System.Collections.Generic.IEnumerable<U>, System.Func<U,V>) (in class Enumerable)
System.Linq.IQueryable<V> Select<U,V>(this System.Linq.IQueryable<U>, System.Linq.Expressions.Expression<System.Func<U,V>>) (in class Queryable)
谁能解释一下这个现象,解决这个错误的方法是什么?
=== 编辑(2010-03-16 5:35pm)===
谢谢迈克二号。我也尝试了一个像你这样的简单例子。它有效,但这不适用于我的。我贴出的代码如下:
public class NSM<U, V> where U : IQueryable<U> where V : new()
{
private U _src;
public NSM(U source) { _src = source; }
public IQueryable<V> LeafNodes
{
get
{
return from s in _src where (s.Right - 1 == s.Left) select new V();
}
}
}
我希望将 LeafNodes 函数重写为 linq 方法链方法。有什么想法吗?
【问题讨论】:
-
谢谢大家。第一个的等效语句是什么?
-
除非 U 是具有 Right 和 Left 属性的东西,否则您添加的代码不会编译。所以它不能只是一个
IQueryable<U>,除非有一个where U : ILeftRight或其他东西。 -
感谢您更新的示例,我明白了。请参阅下面的更新答案。感谢您提供更多信息。
-
谢谢大家。该解决方案有效,该示例清楚地阐明了问题。顺便问一下,Expression
> 和 Func 有什么区别? "x => new V()" 的类型可以是其中任何一个? -
是的
x => new V()可以是Func<X,V>或Expression<Func<X,V>>。IQueryable实现可以检查Expression版本的内容并根据需要对其进行解释。这就是 LINQ to SQL 如何将 lambdas 更改为 SQL 查询。如需更好的解释,请参阅msdn.microsoft.com/en-us/library/bb397951.aspx