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 クエリを Linq to Object クエリにコンパイルできる Linq プロバイダーを使用する IQueryable プロキシ/アダプターで IEnumerable コレクションをラップすることです。これは、インメモリ データ クエリを使用するシナリオで役立ちます。

なぜ 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 Integration Tests 呼び出しから発生していました。

Swagger を介して同じ API エンドポイントを呼び出したときに同じ問題が発生しなかった理由について、私は熱狂していました。

基本的な変更を行う必要があることがわかりました。交換する必要がありました:

using System.Data.Entity;

と:

using Microsoft.EntityFrameworkCore;   
于 2021-09-20T15:16:28.957 に答える