2

今日、LINQ を使用しているときに、TakeWhile() が LINQ to エンティティでサポートされていないことを知りました。そのような機能を実装する効率的な方法はありますか? 私が持っているユースケースは以下の通りです -

私は従業員エンティティを持っていて、エンティティを名前でソートしました。今度は、この IQueryable からその時点までレコードを取得したいと思います (EmployeeID = 123)

このようなもの -

IQueryable<Employee> employees = ObjectContext.Employees
          .OrderBy(a => a.Name)
          .TakeWhile(a => a.EmployeeId != 123)

ただし、上記のコードでは、Linq to Entities で TakeWhile がサポートされていないため、エラーがスローされます。


私は以下のアプローチを試しています。誰かがより効率的で効率的なアプローチを持っているかどうか教えてください:

  • 最初の X レコードを取得し、
  • 必要な EmployeeId がその一部であるかどうかを確認し、
    • そうでない場合は、次の X レコードのセットを取得します
    • それらを前のセットと連結します
    • EmployeeID がその一部であるかどうかを再度確認します。
    • 一致する EmployeeId が X レコードのセットで見つかったときにループを中断します。
4

2 に答える 2

0

SQL には同等のものがないTakeWhile()ため、メモリ内でそのステップを実行する必要があります。SQL に相当するものを持たないフィルターを追加IQueryable<>する前に、 を にキャストすることにより、SQL を強制的に実行できます。IEnumerable<>

var employees = ObjectContext.Employees
      .OrderBy(a => a.Name)
      .AsEnumerable()  // filters after this point will be done in memory on each record
      .TakeWhile(a => a.EmployeeId != 123)
于 2013-06-17T12:09:51.233 に答える