【问题标题】:Is there any way of knowing the content of an IQueryable object without using Reflection?有什么方法可以在不使用反射的情况下了解 IQueryable 对象的内容?
【发布时间】:2013-03-17 03:00:46
【问题描述】:

我必须使用给定的类"QueryGenerator",它由用户使用 StringConnection 和提供程序从选定的表和列生成动态查询。无论如何,我不必知道该类的实现,但我必须使用它并且我是股票。

最后,"QueryGenerator" 将结果查询作为对象返回,我唯一知道(因为我在类上使用 Reflector)是我可以对该查询结果执行 IQueryable 强制转换。这是一个例子:

var result = (IQueryable)myQueryGenerator.Result;

为了知道result的内容,我必须使用反射。

那么,有没有更好的方法来找出result 的内容,例如,用它填充一个DataSet?

【问题讨论】:

  • 很多东西都实现了IQueryable,它本身对于处理实际数据并不是一个非常有用的接口。您需要知道数据的实际类型。尝试调用 result.GetType() 来查找对象的 实际 类型并改为使用它。
  • 不确定这是否会有所帮助,因为它很可能会根据查询的内容返回匿名类型,我认为您将陷入反射。
  • @David 据我们所知,它也可以返回一个 DataTable(它实现了 IQueryable)。除非 Robin 能给我们更多关于返回类型的信息,否则我们只是在黑暗中刺痛。
  • @Corey 这就是我说你坚持反射的原因......
  • @David 不一定。反思以发现他正在处理的实际类型,当然,但只是作为开发的东西。如果他知道它返回的具体类型(假设它不是泛型),那么他可以针对该类型进行编码。取决于它是什么类型:)

标签: c# reflection dataset iqueryable


【解决方案1】:

不,没有。

IQueryable 可以返回不同类型的对象(例如,如果您查询对象数组)。在这种极端情况下,您需要在访问枚举查询时确定每个项目的类型。

演示此场景的示例代码:

object[] objs = new object[3]{ "string", 78, DateTime.Now };

var q = objs.AsQueryable().Skip(1).Take(2);

foreach( var o in q )
{
    var t = o.GetType();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-11-05
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多