12

各句が個別に実行されるためAggregate、複数の句を持つ Linq 式の最初の (外側の) 句として使用すると、VB.NET のクエリに致命的な欠陥がありますか?IntoInto

SELECT MIN(ZoneMin), MAX(ZoneMin) FROM PlantLINQ to SQLの「明白な」答えは

Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(), Max()

ただし、この回答は実際には、Minと(およびMaxのような他の集計関数を含める場合) を個別のSQL クエリで取得します。これは、LINQPad で簡単に確認できます。CountAverage

LINQPad によって表示されないトランザクション (またはこれらのクエリをアトミックにする何か) がありますか、それとも競合状態が発生するのを待っていますか? (したがって、上記の質問への回答に示されているトリックを実行して、複数の集計を返す単一のクエリを強制する必要があります。)

Aggregate要約すると、単一の (または少なくとも「アトミック」) クエリで複数の集計関数を返すLINQ-to-SQL クエリはありますか?

(私への明白な答えはAggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin)、最適化されている場合でも、実際にはテーブル全体を 2 回取得し、Linq-to-Entities を使用しMinMax結果を取得するため、「明白」とも言います:-()

VB固有ではないと思ってAggregateいましたが、C#にはこのクエリ式がないようですので、に変更しました。

4

2 に答える 2

1

Aggregateキーワードは使用しませんが、次の構文を使用して1つのクエリで複数の関数を実行できます。

Dim query = From book In books _
    Group By key = book.Subject Into Group _
    Select id = key, _
        BookCount = Group.Count, _
        TotalPrice = Group.Sum(Function(_book) _book.Price), _
        LowPrice = Group.Min(Function(_book) _book.Price), _
        HighPrice = Group.Max(Function(_book) _book.Price), _
        AveragePrice = Group.Average(Function(_book) _book.Price)

ただし、Aggregate句の実装には問題があるようです。Northwindからの次のクエリについて考えてみます。

Aggregate o in Orders
into Sum(o.Freight),
Average(o.Freight),
Max(o.Freight)

これにより、3つのデータベース要求が発行されます。最初の2つは、個別の集計句を実行します。3つ目は、テーブル全体をクライアントにプルバックし、LinqtoObjectsを介してクライアントでMaxを実行します。

于 2012-09-04T14:46:49.633 に答える
0

私のより広い質問に答えるには:Aggregateトランザクションなしで個別の SQL クエリを生成するために壊れていますか?

LINQ のすべてが原因で、クエリを慎重に調整して単一SELECTの .データを集約または操作するオブジェクト。たとえば、この「クエリ」 。

したがって、一般に、複数のクエリを引き起こす可能性のある LINQ クエリの周りにトランザクションが追加されるようにするのは、プログラマの責任です。どの LINQ クエリが複数の SQL クエリに変換される可能性があるかを確実に知る必要があるだけです。

于 2012-10-05T13:06:56.110 に答える