1

私は今週末、タスクを使用してコードのセクションを並列化し、ダッシュボードページに必要なすべてのクエリを実行する作業をしていました。

私が今持っているのは、ほとんどまったく同じクエリとメソッドの最後に異なる行を持つ多くのコピー/貼り付けメソッドです。

1つのオブジェクトコンテキストに対してクエリを記述し、それをデタッチしてメソッドに渡す方法はありますか?

私はこのようなことをしたい:

using(DbContext db = new DbContext)
{
   var query = db.cars.where(x => x.make == "Ford");

   int handleCounts = getDoorHandleCounts(query);
}

public int getDoorHandleCounts(type? query)
{
     using(DbContext db = new DbContext())
     {
          return query.where(x => x.partType == "DoorHandle").Count();
     }
 }

何か案は?

すべてのcount()メソッドはタスク配列から起動されるため、並行して実行されることに注意してください。各カウントクエリを実行するには、新しいオブジェクトコンテキストが必要です。

私はいくつかのグーグルを行い、プリコンパイルされたクエリを使用して別のオブジェクトコンテキストから呼び出すことを考えましたが、実際のクエリは、where条件を決定するためのifブロックの割り当てを伴う複雑なものです。本当に単純ではないクエリをコンパイルできますか?

4

3 に答える 3

0

変化する

public int getDoorHandleCounts(type? query)

public int getDoorHandleCounts(IQueryable<cars> query)

carsそして、クエリが返すオブジェクトの に置き換えます。

編集

次のように、フィルタリングする値を渡すことをお勧めします。

{
   ...
   int handleCounts = getDoorHandleCounts("Ford");
}

public int getDoorHandleCounts(string Make)
{
     using(DbContext db = new DbContext())
     {
          return db.cars.where(x => x.make == Make && x.partType == "DoorHandle").Count();
     }
 }
于 2012-08-25T15:03:58.403 に答える
0

多分私は質問を誤解していますが、これはあなたが探していることをしませんか?

using(DbContext db = new DbContext)
{
   var carsResult = db.cars.where(x => x.make == "Ford");

   int handleCounts = getDoorHandleCounts(carsResult);
}

public int getDoorHandleCounts(IEnumerable<Car> result)
{
     return result.where(x => x.partType == "DoorHandle").Count();         
}

編集:気にしないでください、Task配列についてのあなたの言及を見たのは今だけです。

于 2012-08-25T14:58:26.540 に答える
0

コンテキストとの間でクエリをデタッチおよびアタッチすることはできません。ただし、最初の式を再利用できます。

Expression<Func<Car,bool>> InitialSelection()
{
    return x => x.make == "Ford";
}

public int GetDoorHandleCounts()
{
    using(DbContext db = new DbContext())
    {
        return db.Cars()
               .Where(InitialSelection())
               .Where(x => x.partType == "DoorHandle").Count();
    }
}

そしてあなたの仕事で:

int handleCounts = getDoorHandleCounts();

getXこれは、最初のクエリが「単純」である場合にのみ機能します。つまり、各メソッドで何度も繰り返す必要がある結合セットの結合と述語が含まれていない場合にのみ機能します。

別の方法として、コンテキストを初期化し、クエリを返すメソッドにフィードすることもできます。

public IQueryable<Car> GetInitialQuery(DbContext db)
{
    return db.Cars().Join(....)
           .Where(x => x.make == "Ford")
           .Where(....);
}

public int GetDoorHandleCounts()
{
    using(DbContext db = new DbContext())
    {
        return GetInitialQuery(db)
               .Where(x => x.partType == "DoorHandle").Count();
    }
}
于 2012-08-26T08:21:05.320 に答える