0

SQL Anywhere 12.0.1 データベースにテーブルがあります。

CREATE TABLE Entries (
    ListId        UNIQUEIDENTIFIER NOT NULL,
    . . .
);

同じ ListID を持つテーブル内の行数を取得するには、テーブルにクエリを実行する必要があります。SQL では:

SELECT ListID, COUNT(*)
FROM Entries
GROUP BY ListId;

Entity Framework 4.x を使用してこのクエリを実行し、結果をDictionary<Guid, long>. このようなもの:

public Dictionary<Guid, long> GetRowCounts( MyEntities context ) {
    Dictionary<Guid, long> result = null;
    try {
        result = ( from entry in Entries
                   group entry by entry.ListId into listGroup
                   select listGroup ).ToDictionary( grp => grp.Key, ???? );

    } catch ( Exception ex ) {
        . . .
    }
    return result;
}

一意の ListId が返された行の数が必要であることを思い出してください。「????」の代わりに何を入れますか?

4

1 に答える 1

3

さて、あなたが書いたものを見てください:

が欲しいことを忘れないでください

(私の強調)。だからあなたは必要です:

ToDictionary(grp => grp.Key, grp => grp.Count())

個人的には、次のようなメソッドを作成します。

public Dictionary<Guid, int> GetRowCounts(MyEntities context) {
    return context.Entries
                  .GroupBy(entry => entry.ListId)
                  .ToDictionary(g => g.Key, g => g.Count());
}

...または、それでも、、をDictionary<Guid, long>使用するg => g.LongCount()、または単にキャストする場合は、次のようにします。

.ToDictionary(g => g.Key, g => (long) g.Count())

ほぼ確実に、そこにtry / catchブロックは必要ありません。また、直接戻る方がはるかに簡単です。同様に、適度に複雑なクエリを記述していない限り、クエリ式を使用しても実際にはメリットはありません。拡張メソッドを直接使用する方法も学び、クエリごとに可能な限り単純なコードを記述できるようにします。

于 2012-11-20T20:58:37.023 に答える