1

다음 구조로 데이터베이스에 대한 새 웹 인터페이스를 개발 중입니다.엔티티 프레임 워크 페이징 된 조인과 유니온?

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를 구성 할 수있는 더 좋은 방법이 있습니까?

+0

내 문제 문장을 다시 읽은 후 각 JOIN에 두 가지 조건이 필요 없다는 것을 알았습니다. 각 쿼리에 대해 WHERE 절에 CmsItemTypeID를 지정할 수 있습니다. 오늘 밤 그걸 시도해보고 내가 얻은 오류를 없앨 지 알아봐. 그렇지 않다면이 쿼리에 대한 뷰를 만드는 것이 다른 방법 일 것이라고 생각했습니다. Entity Framework에서 뷰에 대해 페이지 된 쿼리를 수행 할 수 있습니까? – Sam

답변

0

보기에 대한 내 생각으로 올바른 방향으로 나를 지적했습니다. 몇 가지 추가 테스트를 거친 후이 작업을 수행 할 수있었습니다. UNION의 각 부분에 대해 LINQ 쿼리의 SELECT 부분에 동일한 속성을 설정해야 작동 할 수 있습니다. 값이 없으면 수동으로 기본값 (null)으로 설정해야합니다. 예 :

(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 }) 
+0

LINQ'IEnumerable .Union' 연산자는 이름의 첫 번째 문자 만 대문자로 사용합니다. VB.NET은 대소 문자를 구별하지 않습니다. 그러나 이것은 C#에서는 컴파일되지 않습니다. –

+0

당신은 Justin입니다. SQL을 작성할 때 항상 키워드를 대문자로 사용하기 때문에 손으로 타이핑하고 습관적으로 사용했습니다. C# 코드를 사용하여 끝났다 .Union – Sam