如果我试试这个,它会起作用:
var query = myContextObject.Users.Where(u=>u.Name == "John");
query.ToList();
我可以调用ToList
和许多其他扩展方法。
但如果我试试这个:
public List ConvertQueryToList(IQueryable query)
{
return query.ToList();
}
ToList
将不可访问,我猜这是因为ToList
是一个扩展方法,但是在第一个示例中ToList
是如何附加的?在第二个示例中是否可以访问ToList
?
4条答案
按热度按时间3z6pesqy1#
您需要将其编写为:
这将导致
IQueryable<T>
返回适当的List<T>
,因为Enumerable.ToList()
方法需要一个IEnumerable<T>
作为输入(这也适用于IQueryable<T>
,如IQueryable<T>
inheritsIEnumerable<T>
)。话虽如此,实际上没有理由这样使用它,如果你需要创建一个
List<T>
,你可以直接调用ToList()
--在第二层中抽象只会进一步混淆API。如果您尝试转换非通用IQueryable接口,您需要执行以下操作:
这将需要调用如下代码:
或者,如果您想保留这个非泛型(我不推荐),那么您可以用途:
quhf5bfb2#
第一个示例返回
IQueryable<T>
,而在第二个示例中使用IQueryable
(不带泛型类型参数)。您可以查看两个完全不同的接口here和here。
f0brbegy3#
下面是一个扩展方法:
ibps3vxo4#
下面是一个通用扩展方法,适用于使用
IQueryable<<T>>
的情况。当然,它不是绝对安全的,因为类型可能是错误的,强制转换可能会失败。所以,如果你使用这种方法,请小心。