Could someone please help me or get me started with converting this query to an nhibernate queryover query?
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
I haven’t made it past here:
_session.QueryOver<Contract>()
.Left.JoinQueryOver<Contract>(campaign => campaign.Contracts).List()
Namely because nhibernate is generating an on clause between there two table alias Id == Id when it should be CampaignId == Id.
FROM Contract this_ left outer join Contract contract1_ on this_.Id=contract1_.Id
Contract’s “Contracts” property is a self referencing relationship. It is not 1:1 tho.
I’ve pretty much concluded this can’t be done in queryover. At least not in an optimal way. The inability to join a projection and then select from it is pretty much a show stopper.