SORU
2 Mart 2011, ÇARŞAMBA


Nasıl bu karmaşık SQL Sorgu Arabiriminin QueryOver kullanarak yeniden kurabilir miyim?

Hayal (sadeleştirilmiş) aşağıdaki veritabanı düzeni: Database Layout

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
23 Ocak 2012, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3biblecom

    3biblecom

    23 NİSAN 2011
  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • whatever

    whatever

    30 EYLÜL 2005