Linq查询失去了命令

时间:2009-03-31 21:28:02

标签: c# linq

我的数据库中有一个生成有序结果的视图,但是当我在该视图上运行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中的节点被不正确地排序(但是从中派生这些节点的行是有序的)。

3 个答案:

答案 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子句。

见这里: http://www.devx.com/dbzone/Article/8048