Nasıl bu karmaşık SQL Sorgu Arabiriminin QueryOver kullanarak yeniden kurabilir miyim?
Hayal (sadeleştirilmiş) aşağıdaki veritabanı düzeni:

Birçok zorundayız "tatil" belirli bir tarihte belirli bir konuma gitmek için ilgili kayıtları vb.
"Tatil her konaklama (en düşük fiyat gibi), arama kriterleri verildi (, örneğin havaalanı kalkış süresi vb). en iyi veritabanından çekme etmek istiyorum
Aynı fiyat ile birden çok kayıt olacak, sonra Ayrılış tarihi artan tarafından teklif kaydetme (inen) seçmek gerekiyor.
Bu mutlaka en iyi yol olduğunu söylemiyorum) gibi görünüyor bunu yapmak için SQL yazabilirim:
SELECT *
FROM Holiday h1 INNER JOIN (
SELECT h2.HolidayID,
h2.AccommodationID,
ROW_NUMBER() OVER (
PARTITION BY h2.AccommodationID
ORDER BY OfferSaving DESC
) AS RowNum
FROM Holiday h2 INNER JOIN (
SELECT AccommodationID,
MIN(price) as MinPrice
FROM Holiday
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
GROUP BY AccommodationID
) mp
ON mp.AccommodationID = h2.AccommodationID
AND mp.MinPrice = h2.price
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
) x on h1.HolidayID = x.HolidayID and x.RowNum = 1
Gördüğünüz gibi, bu başka bir sorgu içinde bir alt sorgu kullanır.
Ancak, çeşitli nedenlerden dolayı benim tercihim Arabiriminin bu aynı sonucu elde etmek olacaktır.
İdeal olarak, bu QueryOver - QueryOver. akıcı arayüzü ile nedenin arama kriterleri dinamik olarak inşa ederim ve bu kadar kolay olmaktan çıktı. (Arabiriminin Etmeniz kullanmak için umut ben dışarı başlamıştı, ama ne yazık ki yeterince olgun değil.
Çaba (Arabiriminin göreceli bir acemi olmak) sonra yeniden konuk ve min fiyat getirir çok iç sorgu başardı.
public IEnumerable<HolidaySearchDataDto> CriteriaFindAccommodationFromPricesForOffers(IEnumerable<IHolidayFilter<PackageHoliday>> filters, int skip, int take, out bool hasMore)
{
IQueryOver<PackageHoliday, PackageHoliday> queryable = NHibernateSession.CurrentFor(NHibernateSession.DefaultFactoryKey).QueryOver<PackageHoliday>();
queryable = queryable.Where(h => h.TradeNameId == website.TradeNameID);
var accommodation = Null<Accommodation>();
var accommodationUnit = Null<AccommodationUnit>();
var dto = Null<HolidaySearchDataDto>();
// Apply search criteria
foreach (var filter in filters)
queryable = filter.ApplyFilter(queryable, accommodationUnit, accommodation);
var query1 = queryable
.JoinQueryOver(h => h.AccommodationUnit, () => accommodationUnit)
.JoinQueryOver(h => h.Accommodation, () => accommodation)
.SelectList(hols => hols
.SelectGroup(() => accommodation.Id).WithAlias(() => dto.AccommodationId)
.SelectMin(h => h.Price).WithAlias(() => dto.Price)
);
var list = query1.OrderByAlias(() => dto.Price).Asc
.Skip(skip).Take(take 1)
.Cacheable().CacheMode(CacheMode.Normal).List<object[]>();
// Cacheing doesn't work this way...
/*.TransformUsing(Transformers.AliasToBean<HolidaySearchDataDto>())
.Cacheable().CacheMode(CacheMode.Normal).List<HolidaySearchDataDto>();*/
hasMore = list.Count() == take;
var dtos = list.Take(take).Select(h => new HolidaySearchDataDto
{
AccommodationId = (string)h[0],
Price = (decimal)h[1],
});
return dtos;
}
Benim sorum ise ÅŸu...
QueryOver kullanarak istediğim, ya da eğer gerekli Kriterleri API eğer başarmak için nasıl bir fikir?
Tercih ederdim kullanımı HQL ama gerekiyorsa daha çok istiyorum görmek nasıl yapılabileceğini de (bu herşeyi daha da zorlaştırıyor (veya daha karmaşık) inşa arama kriterleri olsa da).
Eğer bu sadece Arabiriminin kullanarak mümkün değil ise, o zaman SQL bir sorgu kullanabilirim. Bu durumda, benim sorum SQL geliştirilmiş/iyileştirilmiş olabilir?
CEVAP
Kriterleri kullanarak bu dinamik arama kriteri elde etmek için yönetmek zorundayım API. Sorunla karşılaştım oldu çiftleri ile iç ve dış birleşimler ve özellikle ilgili sıralama ve sayfa numaralarını ve kaldım başvurmak kullanarak 2 sorgu 1 sorgu için kısıtlama ve kullanma sonucu 1 sorgu gibi '' Madde 2. creteria.

Nasıl bir görüntü Java kullanarak yeni...
Nasıl ASP.NET c kullanarak sorgu dizes...
Nasıl tablo adını SQL sorgu kullanarak...
Nasıl bir yönlendirme sayfası jQuery k...
Nasıl bağımlılıkları Maven kullanarak ...