Entity Framework Paged Join и союзы? - PullRequest
1 голос
/ 05 мая 2011

Я разрабатываю новый веб-интерфейс для базы данных со следующей структурой:

Categories Table (ID, Name, Active, ...)
Products Table (ID, Name, ItemNo, Price, Active, ...)
WebPages Table (ID, Name, Active, ...)
Links Table (ID, Name, Href, Target, Active, ...)
Relations Table (ID, ParentCategoryID, CmsForeignKeyID, CmsItemType, SortOrder, Visible)

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

Мне нужно иметь возможность вернуть постраничный список дочерних узлов для данной родительской категории. Узлы должны быть активными, видимыми и отсортированными (по умолчанию SortOrder, а затем по имени).

Я пытался что-то делать с EF / LINQ, и у меня возникли проблемы в JOINing Relations из-за необходимости использования нескольких критериев (пример: R.CmsForeignKeyID = N.ID, R.CmsItemType = 1), поэтому я даже не попал в профсоюзы и подкачки.

Было бы лучше отказаться от EF как инструмента в этом сценарии и сделать это с традиционным SQL, что-то вроде:

SELECT C.CategoryID As ID, R.CmsItemTypeID, C.Name, R.SortOrder, '' AS Href, '' As LinkTarget, null As MSRP, null As ListPrice, null As Price
FROM kc_Relations R
JOIN kc_Categories C ON R.CmsItemID = C.CategoryID AND R.CmsItemTypeID = 1
WHERE C.IsActive = 1 AND R.IsVisible = 1
UNION
SELECT W.WebPageID As ID, R.CmsItemTypeID, W.Name, R.SortOrder, '' AS Href, '' As LinkTarget, null AS MSRP, null As ListPrice, null As Price
FROM kc_Relations R
JOIN kc_WebPages W ON R.CmsItemID = W.WebPageID AND R.CmsItemTypeID = 0
WHERE W.IsActive = 1 AND R.IsVisible = 1
UNION
SELECT P.ProductID As ID, R.CmsItemTypeID, P.Name, R.SortOrder, '' AS Href, '' As LinkTarget, P.MSRP, P.ListPrice, P.Price
FROM kc_Relations R
JOIN kc_Products P ON R.CmsItemID = P.ProductID AND R.CmsItemTypeID = 2
WHERE P.IsActive = 1 AND R.IsVisible = 1
UNION
SELECT L.LinkID As ID, R.CmsItemTypeID, L.Name, R.SortOrder, L.Href, L.Target As LinkTarget, null As MSRP, null AS ListPrice, null AS Price
FROM kc_Relations R
JOIN kc_Links L ON R.CmsItemID = L.LinkID AND R.CmsItemTypeID = 3
WHERE L.IsActive = 1 AND R.IsVisible = 1

А затем ли логика подкачки на наборе результатов? Или есть лучший способ структурировать БД, который облегчит это?

1 Ответ

0 голосов
/ 10 мая 2011

Моя мысль о взглядах как бы указала мне правильное направление.После некоторого дополнительного тестирования я смог заставить это работать.Вы должны установить одинаковые свойства в части SELECT запроса LINQ для каждой части UNION, чтобы он работал.Если у вас нет значения, вам все равно придется вручную установить его по умолчанию (ноль).Пример:

(from c in Categories select new { ID = c.CategoryId, Name = c.Name, Price = null })
.UNION
(from p in Products select new { ID = p.ProductId, Name = p.Name, Price = p.Price })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...