6

该问题最初是在http://entityframework.codeplex.com/discussions/399499#post928179提出的。

再会!请告诉我发布此问题的位置是否错误。

我有一个查询如下:

IQueryable<Card> cardsQuery =
  dataContext.Cards
  .Where(predicate)
  .OrderByDescending(kc => kc.SendDate)
  .AsQueryable();

然后我尝试:

Task<Card[]> result = cardsQuery.ToArrayAsync();

然后异常上升:

The source IQueryable doesn't implement IDbAsyncEnumerable<Models.Card>

我使用“EF 5.x DbCotext 生成器”的修改版本。

如何避免?

更新

重要的一点是我有IQuerayble<Card>如下方法生产:

class Repository {
  public IQueryable<Card> GetKudosCards(Func<Card, bool> predicate) {
    IEnumerable<KudosCard> kudosCards = kudosCardsQuery.Where(predicate);
     return kudosCards
            .OrderByDescending(kc => kc.SendDate)
            .AsQueryable();
  }
}
4

4 回答 4

9

调用 AsQueryable 有什么意义?如果您使用从 IQueryable 源集合(例如 DbSet、ObjectSet)开始的扩展方法编写查询,则查询也将是 IQueryable。

AsQueryable 的目的是用 IQueryable 代理/适配器包装 IEnumerable 集合,该代理/适配器使用能够将 IQueryable 查询编译为 Linq to Object 查询的 Linq 提供程序。这在您想使用内存数据查询的场景中很有用。

为什么需要 AsQueryable 调用?如果你只是简单地删除它怎么办?

更新

好的,现在看来我明白你的问题了。快速查看ODataQueryOptions.ApplyTo后,我意识到它只是扩展了查询的底层表达式树。您仍然可以使用它以您想要的方式运行查询,但是您需要一些小技巧来将查询转换回通用查询。

IQueryable<Card> cardsQuery =
   dataContext.Cards
    .Where(predicate)
    .OrderByDescending(kc => kc.SendDate);


IQueryable odataQuery = queryOptions.ApplyTo(cardsQuery);

// The OData query option applier creates a non generic query, transform it back to generic
cardsQuery = cardsQuery.Provider.CreateQuery<Card>(odataQuery.Expression);

Task<Card[]> result = cardsQuery.ToArrayAsync();
于 2012-10-18T22:03:25.480 回答
5

问题如下。

我有一个方法:

class Repository {
  public IQueryable<Card> GetKudosCards(Func<Card, bool> predicate) {
    IEnumerable<KudosCard> kudosCards = kudosCardsQuery.Where(predicate);
    return kudosCards
            .OrderByDescending(kc => kc.SendDate)
            .AsQueryable();
  }
}

问题是 kudosCards 有 type IEnumerable<KudosCard>。这会引发异常。如果我将谓词类型更改为,Expression<Func<Card, bool> predicate那么一切正常。

于 2012-10-20T08:30:35.820 回答
1

当我使用 LinqKit 库表达式构建器时,我遇到了同样的问题,最终,它正在生成AsQueryable(),非常令人惊讶的是,它发生在 XUnit 集成测试调用中。

当通过 Swagger 调用同一个 API 端点时,为什么没有发生同样的问题,我对此感到很疯狂。

原来我必须做一个基本的改变。我不得不更换:

using System.Data.Entity;

和:

using Microsoft.EntityFrameworkCore;   
于 2021-09-20T15:16:28.957 回答
0

当我使用LinqKit库表达式构建器时,我遇到了同样的问题,它最终生成了AsQueryable().
非常令人惊讶的是,它发生在我的XUnit集成测试调用中。

当通过 Swagger 调用同一个 API 端点时,为什么没有发生同样的问题,我对此感到很疯狂。


原来我必须做一个基本的改变。
我不得不更换:

using System.Data.Entity;

和:

using Microsoft.EntityFrameworkCore;

在我调用LinqKit表达式方法的地方。

于 2021-06-15T12:10:07.957 回答