5

左結合を含むクエリがあります。

   var query = (from v in context.Vehicles

                //left join vehicleAttributes
                join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId into vAttributes
                from vehicleAttributes in vAttributes.DefaultIfEmpty()

                where v.FleetId == fleetId

                select new { v, vehicleAttributes });

そして今、私はそれをページングする必要があります。

これは機能しますが、すべての行を取得します。実際に必要なものよりもはるかに多く

query.ToList().Select(x => x.v).Distinct().Skip(10 * (page - 1)).Take(10).ToList();

これは私が代わりに試したものですが、今は共同の値がありません

query.Select(x => x.v).Distinct().ToList().Skip(10 * (page - 1)).Take(10).ToList();

何か案は?

ありがとう

4

2 に答える 2

7

ToList() はデータベースへの呼び出しをトリガーするため、Skip と Take を適用した後にのみこれを行う必要があります。OrderBy 句も必要です。

次のようなことができるはずです。

var data = (from v in context.Vehicles
         join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId into vAttributes
         from vehicleAttributes in vAttributes.DefaultIfEmpty()
         where v.FleetId == fleetId
         select new { v, vehicleAttributes })
         .OrderBy(p => p.v.FleetId)
         .Skip(10 * (page - 1))
         .Take(10)
         .ToList();
于 2013-06-11T15:07:11.630 に答える
0

ToListの前に電話しないでくださいSkip。そうすることで、クエリに一致するデータベース内のすべてのレコードが返されます。

SkipEntityFramework クエリで使用するには、 のインスタンスIOrderedQueryableが必要なので、OrderBy句が必要です。

query
    .Select(x => x.v)
    .Distinct()
    .OrderBy(v => v.FleetId)
    .Skip(10 * (page - 1))
    .Take(10).ToList();

この機能の多くを処理するプロジェクトがあります。NuGet (MVC 対応する) とGoogle Codeで利用できます。

それを使用すると、次のようになります。

var factory = new Pagination.PageSourceFactory {
    MaxItemsPerPage = 50,
    DefaultItemsPerPage = 20
};
var source = factory.CreateSource(query, page);
于 2013-06-11T15:15:36.453 に答える