相关疑难解决方法(0)

使用Entity Framework Fluent语法或内联语法编写递归CTE

我是SQL和实体框架(ADO.NET实体映射)中的新递归.我正在进行评论管理,我有一个Comments表,表包含列NewsID, CommentID, ParentCommentID, IndentLevel, CreatedTime.

我正在尝试获取特定新闻项目的评论列表,其中所有评论都是根据父母和创建时间下的孩子排列的,如下所示:

CommentID | time | ParentCommentID
Guid1     |  t1  | null
Guid4     |  t4  | Guid1
Guid2     |  t2  | null
Guid3     |  t3  | Guid2
Run Code Online (Sandbox Code Playgroud)

必须优先考虑子父母关系,然后是创建时间.

到目前为止我所倾向的是(来自互联网资源和之前的stackoverflow Q/A)

  • 如图所示,这些递归查询很慢.使用Entity Framework执行此操作甚至更慢.但它可以实现.
  • 因此,可以通过在SQL Server中创建存储过程并使用功能导入来调用它来完成.另一件事是在实体框架中使用Linq.
  • 在SQL Server中,它以此格式使用

SQL:

WITH cte_name ( column_name [,...n] ) 
AS 
( 
CTE_query_definition –- Anchor member is defined. 
UNION ALL 
CTE_query_definition –- Recursive member is defined referencing cte_name. 
) 
-- Statement using the CTE 
SELECT * 
FROM …
Run Code Online (Sandbox Code Playgroud)

c# linq sql-server entity-framework

12
推荐指数
2
解决办法
2万
查看次数

EntityFramework中的公用表表达式

我在Sql Server中有这个查询,我需要在EntityFramework中使用,那么如何编写一个与此结果相同的EntityFramwork代码

WITH    cte AS
        (
        SELECT  *
        FROM    StockGroups
        WHERE   GroupParent ='Stationery' 
        UNION ALL
        SELECT  g.*
        FROM    StockGroups g
        JOIN    cte
        ON      g.GroupParent = cte.GroupName
        )
SELECT  *
FROM    cte
Run Code Online (Sandbox Code Playgroud)

我不知道如何在EF中转换它,所以我尝试使用join.

from a in db.StockGroups
join b in db.StockGroups on new { GroupParent = a.GroupParent } equals new { GroupParent = b.GroupName }
where
  b.GroupName == "Stationery"
select new {
  a.GroupName,
  a.GroupParent,
  Column1 = b.GroupName,
  Column2 = b.GroupParent
}
Run Code Online (Sandbox Code Playgroud)

但结果并不像CTE一样递归.

.net c# linq common-table-expression entity-framework-4

7
推荐指数
3
解决办法
8383
查看次数

将包含'with'cte的sql语句转换为linq

嘿,我这里有这段代码,与它斗争了好几个小时.这个sql语句的作用基本上是获取指定文件夹的所有子文件夹(@compositeId).

WITH auto_table (id, Name, ParentID) AS
(
SELECT
    C.ID, C.Name, C.ParentID
FROM Composite_Table AS C
    WHERE C.ID = @compositeId

UNION ALL

SELECT
    C.ID, C.Name, C.ParentID
FROM Composite_Table AS C
    INNER JOIN auto_table AS a_t ON C.ParentID = a_t.ID
)

SELECT * FROM auto_table
Run Code Online (Sandbox Code Playgroud)

此查询将返回如下内容:

  • Id | 名称| 的ParentId
  • 1 | StartFolder | 空值
  • 2 | Folder2 | 1
  • 4 | Folder3 | 1
  • 5 | Folder4 | 4

现在我想将代码转换为linq.我知道它涉及某种形式的递归,但仍然因为with语句而停滞不前.救命?

sql linq with-statement common-table-expression

5
推荐指数
1
解决办法
3237
查看次数