.net 如何在LINQ/Entity框架中使用此T-SQL查询?
我只处理一个数据库表/实体对象:NodePath 给定一个特定节点,我希望根据此查询仅获取其所有节点路径的子集:.net 如何在LINQ/Entity框架中使用此T-SQL查询?,.net,linq,tsql,entity-framework,stored-procedures,.net,Linq,Tsql,Entity Framework,Stored Procedures,我只处理一个数据库表/实体对象:NodePath 给定一个特定节点,我希望根据此查询仅获取其所有节点路径的子集: select * from NodePath where NodeId = @GivenNodeId and Id in ( --active paths select a.Id from NodePath a join (
select
*
from
NodePath
where
NodeId = @GivenNodeId and
Id in
(
--active paths
select
a.Id
from
NodePath a join
(
select
[Path],
max(Created) as Created
from
NodePath
group by
[Path]
) b on
a.[Path] = b.[Path] and
a.Created = b.Created
)
如何在VB.NET应用程序中执行此操作
Dim AllPaths = GivenNode.NodePaths.OrderByDescending(Function(p) p.Created)
Dim ActivePaths = ???
您可以创建一个存储过程,然后将其添加到要调用的EDMX模型中。只需右键单击并选择从数据库更新模型,应该有一个存储过程选项卡。另见 在模型浏览器中查找存储过程 右键单击它并选择“创建函数导入” 选择返回的实体类型。在本例中:NodePath 从代码中调用函数:
Dim ActivePaths = context.ActivePaths(GivenNode.Id)
如果想在没有存储过程的情况下实现这一点,就必须使用LINQ或实体SQL。当然也可以是ADO.NET:您可以创建一个存储过程,然后将其添加到要调用的EDMX模型中。只需右键单击并选择从数据库更新模型,应该有一个存储过程选项卡。另见 在模型浏览器中查找存储过程 右键单击它并选择“创建函数导入” 选择返回的实体类型。在本例中:NodePath 从代码中调用函数:
Dim ActivePaths = context.ActivePaths(GivenNode.Id)
如果想在没有存储过程的情况下实现这一点,就必须使用LINQ或实体SQL。当然也可以是ADO.NET:我相信我已经正确地翻译了SQL,但如果需要,我可以进行更改。这是基于创建的最大路径为每个公共路径选择一个节点路径,只要它与节点ID匹配 C解决方案:
var nodePaths = (from p in context.NodePaths
group p by p.Path into g
select g.OrderByDescending(i => i.Created).First()
).Where(p => p.NodeId == givenNodeId);
我认为VB.NET解决方案,而不是我的主要语言:
Dim nodePaths = (From p In context.NodePaths _
Group p By p.Path Into Group _
Select Group.OrderByDescending(Function(i) i.Created).First() _
).Where(Function(p) p.NodeId = givenNodeId)
我相信我已经正确地翻译了SQL,但如果需要,我可以进行更改。这是基于创建的最大路径为每个公共路径选择一个节点路径,只要它与节点ID匹配 C解决方案:
var nodePaths = (from p in context.NodePaths
group p by p.Path into g
select g.OrderByDescending(i => i.Created).First()
).Where(p => p.NodeId == givenNodeId);
我认为VB.NET解决方案,而不是我的主要语言:
Dim nodePaths = (From p In context.NodePaths _
Group p By p.Path Into Group _
Select Group.OrderByDescending(Function(i) i.Created).First() _
).Where(Function(p) p.NodeId = givenNodeId)
不过这有点奇怪,因为它首先创建了最大的节点路径,然后进行过滤。SQL查询似乎就是这样工作的,这就是我这样写的原因。此外,我写这篇文章时考虑了LinqToSql,但我没有看到任何会在实体框架中引起问题的东西。谢谢你,Ryan。我决定暂时采用Marcel的存储过程建议。我知道我最终必须强迫自己和林克相处得更舒服。当然!即使您在代码中不喜欢这样的查询,也可以正常运行它,或者使用LinqPad来查看它生成的查询与您当前的查询相比,这可能会很有趣。不过这有点奇怪,因为它先创建最大的节点路径,然后再创建过滤器。SQL查询似乎就是这样工作的,这就是我这样写的原因。此外,我写这篇文章时考虑了LinqToSql,但我没有看到任何会在实体框架中引起问题的东西。谢谢你,Ryan。我决定暂时采用Marcel的存储过程建议。我知道我最终必须强迫自己和林克相处得更舒服。当然!即使您在代码中不喜欢这样的查询,也可以正常运行它,或者使用LinqPad来查看与当前查询相比它生成了什么查询。我已经用更多的步骤更新了这个答案。谢谢你,马塞尔。我用更多的步骤更新了这个答案。谢谢你,马塞尔。