【发布时间】:2011-05-05 05:57:17
【问题描述】:
我正在为具有以下结构的数据库开发一个新的 Web 界面:
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 然后按名称)。
我尝试使用 EF/LINQ 做一些事情,但由于需要多个条件(例如:R.CmsForeignKeyID = N.ID、R.CmsItemType = 1)而遇到了 JOINing Relations 问题,所以我什至没有去工会和分页。
在这种情况下是否最好放弃 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
然后在结果集上做分页逻辑?或者有没有更好的方法来构建数据库以使这更容易?
【问题讨论】:
-
再次阅读我的问题陈述后,我才意识到我不需要每个 JOIN 上的两个条件;我可以在每个查询的 WHERE 子句中指定 CmsItemTypeID。今晚将尝试,看看它是否消除了我得到的错误。如果不是,我正在考虑另一种解决方法可能是为此查询创建一个视图。 Entity Framework 可以对视图进行分页查询,对吗?
标签: c# asp.net visual-studio-2010 asp.net-mvc-3 entity-framework-4