【问题标题】:Entity Framework Paged Join and Unions?实体框架分页连接和联合?
【发布时间】: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


【解决方案1】:

我对观点的看法有点为我指明了正确的方向。经过一些额外的测试,我能够让它工作。您必须在 LINQ 查询的 SELECT 部分中为 UNION 的每个部分设置相同的属性才能使其正常工作。如果您没有值,您仍然必须手动将其设置为默认值 (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 })

【讨论】:

  • LINQ IEnumerable<T>.Union 运算符仅将其名称中的第一个字母大写。我记得,VB.NET 不区分大小写。但这不会在 C# 中编译。
  • 你说得对,贾斯汀。我是手动输入并出于习惯将其大写,因为我在编写 SQL 时总是将关键字大写。我最终得到的 C# 代码使用 .Union
猜你喜欢
  • 2022-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多