【问题标题】:IQueryable execute expression against underlying QueryProvider针对底层 QueryProvider 的 IQueryable 执行表达式
【发布时间】:2016-06-22 11:08:18
【问题描述】:

你能帮我理解为什么下面的代码在执行过程中会抛出异常吗?

IQueryable<TestDto> data = Enumerable.Range(1, 10000).Select(i => new TestDto()
{
        Id = i,
        Name = (i%1000).ToString()
}).AsQueryable();
var test = data.Provider.Execute<TestDto>(data.Expression);

对我来说很奇怪,当 QueryProvider 和 Expression 都取自同一个 IQueryable 实例时,查询提供程序无法执行表达式!

编辑:考虑到方法 Execute 的参数“表达式”,抛出的异常是 ArgumentException。

【问题讨论】:

  • 您对data.Expression 的期望是什么?您遇到什么错误?
  • 在您的情况下,data.Expression 预计会返回多个 TestDto 对象,但您将 TestDto 作为 TResult (单个项目)传递。尝试传递一个返回单个TestDto(其返回类型为TestDto)的表达式。
  • @YacoubMassad 非常感谢。就是这样:)

标签: c# linq-to-objects iqueryable


【解决方案1】:

Execute:在底层数据源上执行指定的表达式。 data.ExpressionConstantExpression(保存值)。

您需要向Execute 传递一个有效的表达式树,例如filter 谓词或 Projection 可以由提供者进一步解释。

以下是有效用法:

IQueryable<Item> data = Enumerable.Range(1, 10000).Select(i => new Item()
{
        SomeProperty = i
}).AsQueryable();

Expression<Func<Item, bool>> expression = x => x.SomeProperty > 50;

var obj = data.Provider.Execute(expression);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2017-05-30
    • 2020-09-01
    • 2010-12-07
    相关资源
    最近更新 更多