다음 구조로 데이터베이스에 대한 새 웹 인터페이스를 개발 중입니다.엔티티 프레임 워크 페이징 된 조인과 유니온?
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)
관계 테이블은 상위 카테고리와 그 하위 카테고리, 제품, 웹 페이지 또는 하위 페이지 간의 관계를 설정하는 데 사용됩니다. 모래밭.
주어진 부모 범주에 대한 자식 노드의 페이지 목록을 다시 가져올 수 있어야합니다. 노드는 Active, Visible 및 Sorted (기본 SortOrder, Name 순) 여야합니다.
EF/LINQ를 사용하여 몇 가지 작업을 시도했는데 여러 기준 (예 : 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
그런 다음 결과 집합에서 페이징 논리를 수행합니까? 아니면 더 쉽게 DB를 구성 할 수있는 더 좋은 방법이 있습니까?
내 문제 문장을 다시 읽은 후 각 JOIN에 두 가지 조건이 필요 없다는 것을 알았습니다. 각 쿼리에 대해 WHERE 절에 CmsItemTypeID를 지정할 수 있습니다. 오늘 밤 그걸 시도해보고 내가 얻은 오류를 없앨 지 알아봐. 그렇지 않다면이 쿼리에 대한 뷰를 만드는 것이 다른 방법 일 것이라고 생각했습니다. Entity Framework에서 뷰에 대해 페이지 된 쿼리를 수행 할 수 있습니까? – Sam