Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在LINQ/Entity框架中使用此T-SQL查询?_.net_Linq_Tsql_Entity Framework_Stored Procedures - Fatal编程技术网

.net 如何在LINQ/Entity框架中使用此T-SQL查询?

.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 (

我只处理一个数据库表/实体对象:NodePath

给定一个特定节点,我希望根据此查询仅获取其所有节点路径的子集:

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来查看与当前查询相比它生成了什么查询。我已经用更多的步骤更新了这个答案。谢谢你,马塞尔。我用更多的步骤更新了这个答案。谢谢你,马塞尔。