2016-08-16 32 views
3

パラメータを渡すとIQueryableを返すメソッドがあります。この方法では、13個の別々のIQueryableを生成します。私が必要と複数のIQueryableを単一の実行ポイントで実行する

最終結果はあるが、私の現在の実装よりも、これは、より効率的にするために、IQueryables以内に設定私の記録の13種類のカウントを取得することです:

var foo = iQueryableObject.Count(); 
var bar = iSecondQueryableObject.Count(); 

私はすべて実行したいのですが単一の実行時点でのSQLサーバー上のカウント、このような理論なものになるよう:

var foobar = new IQueryable<object>[] 
{ 
    iQueryableObject.DeferredExecutionCount(), 
    iSecondQueryableObject.DeferredExecutionCount() 
}.ToList(); 

誰もが、私はこれを達成することができますどのように任意のアイデアを持っていますか?

+0

はhttps://github.com/loresoft/([将来のクエリ]を見てみましょうEntityFramework.Extended/wiki/Future-Queries)を参照してください。 –

+0

それは面白そうに見えます、私はそれをチェックアウトします。ありがとう。 – Lee

答えて

1

実際のデータベースに対してこれを試す必要がありますが、これを実現するにはGroupByUnion(またはConcat)を使用できます。

は、以下のPOCOS(あなたのEFエンティティを)考えてみましょう:

class Thing 
{ 
    public string One { get; set;} 
} 

class Thang 
{ 
    public string Two { get; set;} 
} 

今すぐあなたのクエリ:

var foo= Things 
    .Where(t => t.One == "One") //or whatever your filtering condition 
    .GroupBy(t => t.One) 
    .Select(t => new {Key = "FirstQuery", Count = t.Count()}); 

var bar = Thangs 
    .Where(t => t.Two == "Two") 
    .GroupBy(t => t.Two) 
    .Select(t => new {Key = "SecondQuery", Count = t.Count()}); 

var deferredCounts = foo.Concat(bar).ToList(); 
+0

それは素晴らしいです。私は今これをテストすることに成功し、要求通りにカウントの実行を延期することを確認しました。乾杯。 – Lee

関連する問題