1

質問があります:

model.Queue = _db.Orders
                .Join(_db.Tool,
                    a => a.PART_KEY,
                    b => b.PART_KEY,
                    (a, b) => new { a, b })
                .Where(r => (r.a.PART_KEY == r.b.PART_KEY) && (r.b.Site == Site))
                .Where(r => (r.a.Start > 0) && (r.a.Finish == 0))
                .GroupBy(r => new { r.a.GROUP })
                .Select(r => new Queue
                {
                    name = r.Key.GROUP,
                    count = r.GroupBy(g => g.a.PART_KEY).Count(),
                    average = r.Average(g => g.a.DaysInSequence)
                });

クエリは現在、ユーザーのメトリックを生成するために使用されています。ユーザーは、テーブルからの完了した注文を含むようにメトリクスを拡張することを望んでいますOrdersCompleted。データベースでは、注文が完了すると、注文全体が から に移動OrdersOrdersCompleteます。両方のテーブルの構造は同じです。つまり、同じ列と同じモデル クラスです。

使用する必要がある拡張メソッドは のようですがConcat、この特定のクエリで機能させるための構文を理解するのに問題があります。最初の拡張メソッドが機能するように追加するよう.Concat(_db.OrdersComplete)ですが、そうではないようです。

4

2 に答える 2

2

問題は、2 つのテーブルにまったく同じ型と名前のまったく同じ列がある場合でも、クラスを生成するツールが異なる名前の 2 つの型を作成することです。タイプがまったく同じでConcatはないため、機能しません。タイプを共有するように、一方または両方のテーブルをマップするために何かをする必要があります。

1 つのオプションは、両方を匿名型にマップすることです。次のようなものを追加します。

.Select(o => new
{
    o.PART_KEY,
    o.GROUP
    //Any other columns you need from each order
});

_db.Ordersと同様に両方の後_db.OrdersComplete。それからConcat意志が働きます。

もう 1 つのオプションは、結合されたすべての注文を処理する必要があることが一般的であると思われる場合は、DB クラスが関連していないという根本的な問題に対処することです。実際の DB オブジェクトを変更して、すべてのクエリでこれを簡単にすることができます。

1 つのオプションは、両方のクラスが拡張/実装できるインターフェイスまたは基本型のいずれかを作成することです。2 つの型が共有するすべての列を持つインターフェイスを作成し、両方にインターフェイスを実装させる場合は、 を使用Concatしてそのインターフェイスの列挙を作成できます。(ただし、Linq-To-Sql でうまく機能するかどうかはわかりません。)

3 番目のオプションは、データベース内にビューを作成することです。ビューは、内部的にはUnion Allこれら 2 つのテーブルにのみ存在し、1 つまたは両方のテーブルから列のサブセットを取得する可能性があります。テーブルを自分で連結する代わりに、そのビューからクエリを実行できます。

于 2013-01-07T18:20:00.040 に答える
0

Servy の答えは正しいです。これを行う最も簡単な方法は、基本的に 2 つのクエリのそれぞれから匿名クラスを作成することです。匿名クラスが同じプロパティを持っている限り、 と の両方ConcatUnion機能します。

考えられる代替手段の 1 つは、両方のテーブルで同じクエリを実行することです (既に結果を新しいQueueオブジェクトに射影Concatし、2 つのクエリの結果を投影しているためです。

于 2013-01-07T18:19:50.593 に答える