【问题标题】:IQueryable<> is losing its initial type after Linq Skip/Take在 Linq Skip/Take 之后,IQueryable<> 正在丢失其初始类型
【发布时间】:2018-03-13 16:32:28
【问题描述】:

有人可以解释如何避免以下情况吗?

我有一个名为 data 的变量,它是 IQueryable&lt;&gt;。正如您在调用 Skip/Take 之前所见,运行时知道它的确切类型 (IQueryable&lt;...Module&gt;)。

在执行 Skip/Take 后,变量数据变为IQueryable&lt; object&gt;

我希望它保留在执行 Skip/Take 之前的原始类型。在执行填充 data 变量的方法之前,我不知道 中的确切类型。后来我知道了,我可以得到我想使用的Type,以便将 Skip/Take 转换回原始类型。我怎样才能做到这一点?

PS1:集合已由返回IQueryable&lt; object&gt;的方法返回

PS2:在跳过/拍摄之前,它的行为类似于IQueryable&lt; ...module&gt;

【问题讨论】:

  • 您已经在这里回答了您自己的问题 - 这是因为您有一个 IQueryable&lt;Object&gt; 集合开始。您在运行时看到它的实际类型的原因 - 这只是调试器的帮助。
  • Take 和 Skip 是一种通用方法,所以您尝试过 .Take(...) 吗?
  • @VidmantasBlazevicius 部分正确。如果 Skip/Take 没有执行,它的行为就像一个 一直到方法的末尾。
  • @SimplyGed 我事先不知道它是一个 Sales.Module。我知道只有在运行时,填充数据变量的方法才会执行。我想知道是否通过获取类型,我可以通过反射将 Skip/Take 转换为该类型。
  • @Midas 你这是什么意思?

标签: c# linq generics reflection


【解决方案1】:

在执行SkipTake 之前,您的集合是IQueryable&lt;Object&gt;。您需要将您的集合转换为其确切的类型。

【讨论】:

  • 我事先不知道确切的类型。我可以通过反射得到它,所以我的问题是如何使用反射类型将 Skip/Take 结果转换回 IQueryable?我已经编辑了我的问题。
【解决方案2】:

如果您的方法返回一个IQueryable&lt;object&gt;,这就是代码所知道的全部内容。如果您确定类型,您可以酌情使用OfType&lt;Module&gt;()Cast&lt;Module&gt;() linq 调用将它们恢复为您期望的类型,而不是代码期望的类型。

编辑:在原始帖子上阅读了您的 cmets 后,听起来您的返回 IQueryable&lt;object&gt; 的函数实际上应该被制成返回 IQueryable&lt;T&gt; 的通用函数,这样一开始就不会遇到这个问题地方。这似乎越来越成为一个 XY 问题。如果此答案无效,我将其删除。

【讨论】:

  • 我不确定类型,直到执行填充“数据”变量的方法。然后我可以通过反射得到类型(Type)。我想使用它来将跳过结果转换为该特定类型。
  • 第二点。 Generic 会立即解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多