【问题标题】:ASP.NET Web API programmatic way of applying IQueryable to an Entity Framework query将 IQueryable 应用于实体框架查询的 ASP.NET Web API 编程方式
【发布时间】:2018-05-01 16:18:08
【问题描述】:

我们可以通过 Web API 接受来自 URL 的 OData 查询,这很简单:

[EnableQuery]
public IQueryable<EFType> GetBuiltInTypes()
{
    return db.EFTypes;
}

在将 OData 查询添加到实体框架数据库查询时,数据在数据库中受到限制。

假设我想在返回数据之前对其进行一些处理:

[EnableQuery]
public IQueryable<SomePOCO> GetBuiltInTypes()
{
    var dbQuery = from obj in FncCall() select obj;

    //Do something with the data and put the result into a 
    //List<SomePOCO>

    var list = DoSomeWork(dbQuery) //whatever

    return list.AsQueryable();
}

注意:FncCall() 返回通用 DbSet 而不是 DbSet&lt;SomeType&gt;

它仍然可以工作,但它会限制结果并将 OData 查询应用到内存中我的list,而不是将dbQuery 应用到数据库?有什么简单的方法吗?

来自 Microsoft 文档:

我们可以的

public IQueryable<Product> Get(ODataQueryOptions opts) {
    var settings = new ODataValidationSettings() {
        // Initialize settings as needed.
        AllowedFunctions = AllowedFunctions.AllMathFunctions
    };

    opts.Validate(settings);

    IQueryable results = opts.ApplyTo(products.AsQueryable());
    return results as IQueryable<Product>;
}

但我不知道类型,在这种情况下,编译时 Product 因为我必须使用的是 DbType

【问题讨论】:

  • 好吧,没有任何关于 DoSomeWork() 做什么的上下文,只要它是可以转换为 SQL 并返回为 IQueryable 的东西就可以了吗?
  • 是的,但这不是一项可以添加到查询中并在数据库中完成的工作,它将对象转换为另一组对象类型。
  • 我还是不明白为什么你必须使用通用版本? OData 库上的哪些方法仅限于 IQueryable 的通用版本?
  • 可能我真的看不太对...我再复习一下...稍后我会更新或回复

标签: c# asp.net entity-framework asp.net-web-api odata


【解决方案1】:

是的,不要调用 ToList/ToArray/AsEnumerable/etc。或任何其他会导致您的 IQueryable 实例调用数据库的东西。

例如:

[EnableQuery]
public IQueryable<SomePOCO> GetBuiltInTypes()
{
    var dbQuery = from obj in FncCall() select obj;
    // at this point the database has not yet been called
    IQueryable<SomePOCO> result = DoSomeWork(dbQuery);
    return result;
}

private IQueryable<SomePOCO> DoSomeWork(IQueryable<SomePOCO> dbQuery)
{
   // still not executed against db
   return dbQuery.Where(x => x.something == "something");
}

【讨论】:

  • 是的,我的问题是我想限制结果并将查询应用于数据库,然后再使用它...请查看我的最后一次编辑:)
  • @PedroFigueiredo - 这正是这样做的。 DoSomeWork 中的 where 子句仍应用于将在应用 OData 转换表达式之前执行的结束查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多