2013-04-09 18 views
7

'dan gelen sunucu sonuçlarını sınırlandırın VS 2012'de bir NHAbernate yazılımı oluşturdum ve NHibernate'i ORM olarak kullanıyorum ve Odata desteğini etkinleştirmeyi düşünüyorum. Bu nedenle, veritabanımdaki bir tablodan varlıkların listesini döndüren tek bir Get yöntemiyle bir test denetleyicisi oluşturdum.WebApi denetleyicisinden ve ODATA w/Nhibernate

Her şey iyi çalışıyor, sonuçları filtrelemek ve sipariş vermek için OData'yı kullanabilirim. Sorun, veritabanından denetleyiciye döndürülen veri miktarını sınırlamanın bir yolunu bulamadım ve bu tablo içinde milyonlarca kayıt var.

Queryable özniteliğinin PageSize özelliğinin kullanılması, istemciye döndürülen veri miktarını sınırlandırıyor gibi görünüyor, ancak DB'den döndürülen veri miktarı yok.

bunu dönmeden önce olsun yönteminin içine IQueryable üzerinde Take(n) uygulayarak denedim ve sonuç DB'den geri getirdi sınırlar, ancak değil bir varlık sorgulamak çalışırsanız bu yana, OData filtreleme kırar İlk n sonuçlarında, boş bir koleksiyona geri dönüyor.

Bunu gerçekleştirmek için OData'daki $Top parametresini kullanabileceğinizi biliyorum, ancak gereksiz yere binlerce veya hatta milyonlarca kayıt getirmediğimden emin olmak için istemciye/tüketiciye bağlı olmamak istiyorum. Kullanmayacağım.

Ayrıca, istemcinin sorgu dizesinde bir Üst parametre sağlayıp sağlamadığını, Queryable'a OData dönüşümünü uygulayıp sonra dönüştürülen sorgu üzerinde Take(n) yöntemini uygulayıp uygulamadığını da elle denedim. Bu yaklaşım, OData aracılığıyla herhangi bir varlık için filtreleme yapmamı sağladı, ancak sayfalandırma kırılıyor, çünkü $Skip=n parametresini kullanırsam boş bir koleksiyona geri dönüyor.

OData desteğini kesmemekle birlikte, DB'den getirilen sonuçları güvenilir şekilde sınırlamanın herhangi bir yolu var mı?

+1

OData ve NHibernate arasında köprü olarak ne kullanıyorsunuz? OData'yı bir NHibernate IQueryable'a dönüştürmeyi mi yoksa bir kütüphaneyi mi kullanıyorsunuz? Ayrıca, geçmişte, kullanıcıların bir API üzerinden döndürülen tüm sonuçlarda otomatik olarak TOP 1000'i uyguladıklarını ve yalnızca istenen verilerin bir kısmını aldıklarını ve genellikle arayanın önceden oluşturulmuş bir URL sağladığını belirten bazı bilgiler gönderdiklerini gördüm sonraki 1000 sonuçlara geri dönecek. Arayan tüm verileri aldıkça verilen URL'leri kullanmaya devam edecektir. –

+0

Sorguları doğrudan oluşturmak için OData kullanmıyorum, ancak istemcimin döndürülen sonuçları varolan yöntemlerden filtrelemesi için bir kolaylık aracı olarak kullanıyorum. Örneğin, örneğin, NHibernate için Linq kullanarak bir querie gerçekleştiren bir GetAllProducts() yöntemim var ve bu IQueryable'ı döndürüyorum. Tanımladığınız davranış, PageSize özelliğini Queryable atribute üzerinde kullanırken varsayılan davranıştır, ancak yazımda bahsettiğim gibi bu yalnızca istemcinin ne aldığını sınırlar, ancak DB'den hizmet yöntemime getirilen sonuçları değil. – andyroschy

cevap

2

Son zamanlarda bunu da bulduk. Sunucu yönlendirmeli çağrı etkinken, bir sonraki sayfa bağlantısının oluşturulup oluşturulmayacağını anlamak zorunda olduğumuz için bir Take (pageSize) uygulamıyoruz. Yalnızca sayfa sayısı sayısı için var olan sonuçların sayısını sıralıyoruz ve daha fazla varlık olup olmadığını kontrol ediyoruz. Çoğu sağlayıcıların genellikle IQueryable'ın genellikle tembel bir uygulama olduğu için kısmi sonuçlar getirdiğini düşündük. Bunun doğru olmadığı ortaya çıkıyor. Ayrıca, veritabanı yalnızca sayfa boyutunu bilmesi durumunda sorgu sayısını optimize edebilir. Bunun için açılan sorun

This'dur. İyi haber, Youssef zaten onu çözdü :). Bu, düzeltilen commit'dur. Yani, eğer gece alırsan, iyi olmalısın.

+0

Bu sorunu dün gördüm, ancak düzeltmenin bağlantısını tıklarsanız sayfa eksiktir, bu da bana kötü bir önsezim verir. Bunu yapmak için güncel bir inşayı deneyip test etmeyi deneyeceğim. – andyroschy

+1

Kodplex'in artık kısmi sha1'i anlamadığı anlaşılıyor. Her neyse, bu bağlantı https://aspnetwebstack.codeplex.com/SourceControl/changeset/8517d73f5f60ffb3e1c8a590af4695c7bda37709 çalışmalıdır –