代码之家  ›  专栏  ›  技术社区  ›  Zack Peterson

如何在LINQ/实体框架中使用此T-SQL查询?

  •  1
  • Zack Peterson  · 技术社区  · 16 年前

    我只处理一个数据库表/实体对象: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 = ???
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Zack Peterson    16 年前

    您可以创建一个存储过程,然后将其添加到要调用的EDMX(模型)中。只需右键单击并选择“从数据库更新模型”,就应该有一个“存储过程”选项卡。也见 here .

    在模型浏览器中查找存储过程。

    右键单击它并选择创建函数导入。

    Entity Data Model Create Function Import http://img31.imageshack.us/img31/9100/createfunctionimport.gif

    选择返回的实体类型。(在本例中:nodepath)

    从代码中调用函数:

    Dim ActivePaths = context.ActivePaths(GivenNode.Id)
    

    如果要在没有存储过程的情况下执行此操作,则必须使用LINQ或实体SQL。当然是ADO.NET:)

        2
  •  3
  •   Ryan Versaw    16 年前

    我相信我已经正确地翻译了那个SQL,但是如果必要的话,我可以进行更改。这是选一个 NodePath 对于每一个共同点 Path (基于最伟大的 Created ,只要它与 NodeId .

    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)