我的数据库中有一个生成有序结果的视图,但是当我在该视图上运行Linq查询时,结果不再被排序(至少,根据我用来迭代结果的foreach,并根据到调试器)。这对Linq来说是一个众所周知的困难,还是我错过了什么?
更新:我的观点,来自SQL Server 2008(来自设计视图):
SELECT TOP (100) PERCENT UrlId, Title, Description, Url, Parent, ResourceKey, Published, dbo.udf_SiteMap_GetRoles(UrlId) AS Roles
FROM dbo.SiteMap
ORDER BY DisplayOrder
构建SiteMap的Linq查询:
SqlConnection connection = new SqlConnection(_connect);
DataContext dc = new DataContext(connection);
Table<NodeRoleEntity> siteMapTable = dc.GetTable<NodeRoleEntity>();
var rootQuery = from ne in siteMapTable
where ne.ParentID == null
select ne;
foreach (NodeRoleEntity rootNode in rootQuery)
{
SiteMapNode root = rootNode.AsSiteMapNode(this);
base.AddNode(root, _root);
AddChildNodes(root, siteMapTable);
}
此查询使用上面构建的SiteMap在我的ASP.NET应用程序中呈现菜单:
StaticSiteMapProvider _provider = SiteMap.Providers["MySiteMap"] as StaticSiteMapProvider;
string cultureToken = _GetCulture().ToLower();
SiteMapNode cultureRoot =
(from SiteMapNode cr in _provider.RootNode.ChildNodes
where cr.Description == cultureToken
select cr).First();
int menuCount = 0;
foreach (SiteMapNode node in cultureRoot.ChildNodes)
{
_RenderMenu(node, menuCount.ToString(), writer);
menuCount++;
}
cultureRoot.ChildNodes
中的节点被不正确地排序(但是从中派生这些节点的行是有序的)。
答案 0 :(得分:2)
你的linq查询是:
var rootQuery = from ne in siteMapTable
where ne.ParentID == null
select ne;
这将生成像这样的SQL
SELECT *
FROM SiteMapTable
WHERE ParentID == @P1
您可以将此sql带到数据库,运行它并观察您的结果是否未被排序。这是发生的事情:
在数据库中,视图文本将作为子查询放入查询中。
SELECT *
FROM
(
SELECT top 100 percent *
FROM ...
ORDER BY ...
) as SiteMapTable
WHERE ParentID == @P1
查询优化器会注意到最外层没有要求排序,并确定结果不需要订单。它将剥离/忽略子查询中的排序。您可以查看估计的执行计划以确认这一点。
答案 1 :(得分:0)
当您从视图中选择时,它不会保持其顺序。你必须输入LINQ:
SiteMapNode cultureRoot = (
from SiteMapNode cr in _provider.RootNode.ChildNodes
where cr.Description == cultureToken
orderby cr.DisplayOrder
select cr
).First();
答案 2 :(得分:0)
严格说来,在SQL Server的视图中不允许使用ORDER BY子句。 您必须在linq查询中添加OrderBy子句。