Как сделать бесплатное (не связанное) объединение для одной конкретной строки с XPO?
Скажем, у меня есть постоянный класс DailyVisitorSummary, который описывает для каждой веб-страницы, сколько посетителей у него было в день. Для упрощения предположим, что мы представляем день как целое число.
Теперь я хотел бы создать запрос для извлечения данных за определенный день, а также данных за предыдущий и следующий дни. Что я знаю, так это то, что для одной и той же веб-страницы наверняка будет не более одной записи данных за предыдущий и следующий день, поэтому я мог бы написать запрос SQL (синтаксис MySQL), например:
SELECT c.*,p.*,n.* from DailyVisitorSummary c
LEFT JOIN DailyVisitorSummary p ON p.WebPage = c.WebPage AND p.Day = c.Day - 1
LEFT JOIN DailyVisitorSummary n ON n.WebPage = c.WebPage AND n.Day = c.Day + 1
WHERE c.Day = 453;
Я хотел бы заполнить следующую viewmodel с результатом:
public class VMDailyVisitors3Day {
public VMDailyVisitors CurrentDay { get; set; }
public VMDailyVisitors PreviousDay { get; set; }
public VMDailyVisitors NextDay { get; set; }
}
public class VMDailyVisitors {
public int Day { get; set;; }
public int WebPageID { get; set; }
public int VisitorCount { get; set; }
}
Как я могу сделать этот запрос с Linq для XPO? Мне нужно решение LINQ, потому что мне нужно использовать результат в серверном режиме MVC GridView.
2 ответа
Я нашел обходной путь с помощью поддержки DX, используя атрибут PersistentAliasAttribute в качестве промежуточного шага, где я могу делать свободные объединения, а затем использовать это свойство в XPQuery. Если кто-то заинтересован, проверьте здесь.
Linq to XPO поддерживает только групповое соединение. Возможным решением было бы создать представление SQL в базе данных и заполнить его данными, используя ваш запрос SQL. Затем вы можете сопоставить другой постоянный класс с этим представлением для получения данных.
В представлении должен быть хотя бы один столбец с уникальными значениями. Не используйте функцию newid или аналогичную для генерации уникальных значений, поскольку этот подход назначает разные значения одной и той же строке при каждом запросе данных. Режим сервера использует ключевой столбец для идентификации строк. Используйте фактические данные для заполнения ключевого столбца. Например, объедините значения из столбцов WebPage и Day. Убедитесь, что это дает разные значения.