c# - IQueryable 转换

标签 c# .net lambda expression iqueryable

为什么可以在“OK”行进行转换,而在“NOT OK”行则不行?

var queryable = new int[]{1, 2, 3}.AsQueryable();

var x = (Expression<Func<IQueryable<int>>>)(() => (from c in queryable select c));

var yy = (Expression<Func<IEnumerable<int>>>)x;  // NOT OK (does not compile)
var zz = (Expression<Func<IEnumerable<int>>>)(() => (from c in queryable select c)); // OK

更新:错误信息是:

Cannot convert type System.Linq.Expressions.Expression<System.Func<System.Linq.IQueryable<int>>> to 'System.Linq.Expressions.Expression<System.Func<System.Collections.Generic.IEnumerable<int>>>'

最佳答案

因为 Expression是一个类并且IEnumerable是一个接口(interface)。类不是协变的,而接口(interface)和委托(delegate)是协变的。

这意味着您无法转换 Expression<A>Expression<B>即使 B 是 A 的基类。

所以如果这一行:

() => (from c in queryable select c)

返回

Func<IQueryable<int>>

它可以转换成

Func<IEnumerable<int>>

但如果你已经拥有

Expression<Func<IQueryable<int>>>

不能转换成

Expression<Func<IEnumerable<int>>>

关于c# - IQueryable 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629603/

相关文章:

java - 为什么 (.*)* 进行两个匹配并且在 $1 组中没有选择任何内容?

c# - C# 中的 Object.Equals 说明?

c++ - 初始化和 lambda 类型参数

c++ - lambda 函数中的 Const 引用参数

c++ - 使用 lambda 完美转发pair.second

c# - AWS Lambda 是否对异步 .NET Core 函数等待的时间收费?

.net - 使用 Redis 扩展 Web 服务

c# - 尽管我没有回滚我的事务,但 SQLite 事务没有成功?

c# - 字符串到字节[],反之亦然?

c# - 从同一解决方案打开 c# 命名空间,在 f# 中引用项目