5

この件について複数の質問を見てきましたが、それらは 2 年 (またはそれ以上) 経過していたので、これについて何か変化があったかどうかを知りたいです。

基本的な考え方は、グリッドビューにデータを入力し、カスタム ページングを作成することです。したがって、結果と行数も必要です。

SQL では、これは次のようになります。

SELECT COUNT(id), Id, Name... FROM ... WHERE ...

素敵な単純なクエリですべてを取得します。ただし、一貫性を保ち、Linq2Entities を使用したいと考えています。

これまでのところ、2 つのクエリ (SQL サーバーに対して) でこのアプローチを使用しています。ただし、それを最適化し、代わりに単一のクエリを使用したいと思います。

私はこれを試しました:

var query = from o in _db.Products
                        select o;

var prods = from o in query
            select new
            {
                 Count = query.Count(),
                 Products = query
            };

これにより、非常に厄介で長いクエリが生成され、本当に不要なクロス結合や、私が本当に必要としない、または望んでいないその他のものがあります。

ページングされた結果とすべてのエンティティの数を 1 つの単純なクエリで取得する方法はありますか? ここで推奨されるアプローチは何ですか?

アップデート:

FutureQueries を試してみましたが、何か間違っているか、実際に 2 つのクエリを実行しています。これは私のSQLプロファイラーを示しています:

-- Query #1

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[Products] AS [Extent1]
    WHERE 1 = [Extent1].[CategoryID]
)  AS [GroupBy1];

そして次の行:

-- Query #1

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name], 
[Extent1].[Price] AS [Price], 
[Extent1].[CategoryID] AS [CategoryID]
FROM [dbo].[Products] AS [Extent1]
WHERE 1 = [Extent1].[CategoryID];

C# コード:

internal static List<Product> GetProducts(out int _count)
{
    DatabaseEntities _db = new DatabaseEntities();

    var query = from o in _db.Products
                where o.CategoryID == 1
                select o;

    var count = query.FutureCount();

    _count = count.Value;
    return query.Future().ToList();
}

私は何か見落としてますか?私のプロファイラーによると、クエリに行を追加したことを除いて、まったく同じことを行います(-クエリ#1)。

4

2 に答える 2

3

EntityFramework.Extendedでこれを行うには、Future Queries をご覧ください。そのリンクされたページの 2 番目の例は、FutureCount()あなたが望むことを正確に行うために使用します。ここに適応:

var q = db.Products.Where(p => ...);
var qCount = q.FutureCount();
var qPage  = q.Skip((pageNumber-1)*pageSize).Take(pageSize).Future();

int total = qCount.Value;     // Both queries are sent to the DB here.
var tasks = qPage.ToList();
于 2012-05-23T16:17:16.617 に答える
0

この 'EntityFramework.Extended' ライブラリはサポートされなくなりました。代わりにこれを使用してください: entityframework-plusに移動し、 https ://entityframework-plus.net/query-future にアクセスして、同じクエリでカウントとレコードを取得する方法を確認してください。

于 2019-07-11T11:56:32.010 に答える