Преобразование запроса my-sql в запрос nhibernate - PullRequest
0 голосов
/ 04 августа 2011

Может ли кто-нибудь помочь мне или начать с преобразования этого запроса в запрос запроса nhibernate?

SELECT
    Campaign.Id,
    Location.Name,
    Location.PrimaryPostcode,
    Inventory.Section,
    Campaign.Sov,
    IFNULL(Contracts.Spend, 0) AS Spend,
    IFNULL(Contracts.Impressions, 0) AS Impressions,
    IFNULL(Days, 0) Days,
    RenewalDate,
    LastContract.OptIn
FROM
    Contract AS Campaign
    JOIN Inventory ON Campaign.InventoryId = Inventory.Id
    JOIN Location ON Inventory.LocationId = Location.Id
    LEFT OUTER JOIN (
        SELECT
            CampaignId,
            SUM(RackRate) AS Spend,
            SUM(Impressions) AS Impressions,
            1 + DATEDIFF(Now(), MIN(StartDate)) AS Days,
            DATE_SUB(MAX(EndDate), INTERVAL 11 Day) AS RenewalDate,
            MAX(StartDate) AS CurrentOrNextStartDate
        FROM
            Contract
            LEFT OUTER JOIN Creative On Creative.ContractId = Contract.Id
            LEFT OUTER JOIN CreativeLog On Creative.Id = CreativeLog.CreativeId            
        GROUP BY
            CampaignId
    ) AS Contracts ON Campaign.Id = Contracts.CampaignId
    LEFT OUTER JOIN (
        SELECT
            CampaignId,
            Id,
            Optin,
            StartDate
        FROM
            Contract
    ) AS LastContract ON Campaign.Id = LastContract.CampaignId AND Contracts.CurrentOrNextStartDate = LastContract.StartDate
WHERE
    Campaign.AgencyId = '04ba6b28-a7a0-4448-b21f-9f2b00a4621b'
ORDER BY
    RenewalDate,
    Location.Name,
    Inventory.Section

Я не прошел мимо:

_session.QueryOver<Contract>()
    .Left.JoinQueryOver<Contract>(campaign => campaign.Contracts).List()

А именно потому, что nhibernate генерирует предложение on между двумя псевдонимами таблицы Id == Id, когда оно должно быть CampaignId == Id.

FROM Contract this_ left outer join Contract contract1_ on this_.Id=contract1_.Id 

Свойство Контракта "Контракты" - это ссылка на себя. Это не 1: 1 tho.

Ответы [ 2 ]

0 голосов
/ 24 июля 2012

Я пришел к выводу, что это невозможно сделать в запросе.По крайней мере, не оптимальным способом.Невозможность присоединиться к проекции, а затем выбрать ее, в значительной степени ограничивает показ.

0 голосов
/ 18 августа 2011

вам нужно показать или объяснить, как выполняются ваши сопоставления.Если вы собираетесь присоединить Contract к себе, то вам нужно указать ему, к чему присоединиться, иначе он сделает это с первичным ключом.Если вы используете последнюю версию nhibernate, я полагаю, что вы можете выполнить команду .With и указать ей присоединиться к другой колонке.Если его еще нет, вы можете сделать это с помощью .UnderlyingCriteria

...