Asp.net 使用linq根据自引用表中的一个属性获取父对象

Asp.net 使用linq根据自引用表中的一个属性获取父对象,asp.net,sql,linq-to-sql,Asp.net,Sql,Linq To Sql,我有一个叫做quick的表格,上面有这些字段 id As Int created As DateTime header As Sring body As String fk_parent As int url As String 所有没有父项的项都将是问题,而具有父项的项将是答案。我无法获取所有最新的活动问题(基于问题创建时间和答案创建时间) 我正在努力编写一个可以完成上述任务的Linq查询。这里是一个开始: IQueryable<int> keys = from x in

我有一个叫做quick的表格,上面有这些字段

id As Int
created As DateTime
header As Sring
body As String
fk_parent As int
url As String
所有没有父项的项都将是问题,而具有父项的项将是答案。我无法获取所有最新的活动问题(基于问题创建时间和答案创建时间)

我正在努力编写一个可以完成上述任务的Linq查询。

这里是一个开始:

IQueryable<int> keys =
    from x in dc.Quiz
    let masterID = ParentId.HasValue ? ParentId.Value : Id
    group x by masterID into g
    order g by g.Max(x => x.created) descending
    select g.Key

List<Quiz> = dc.Quiz.Where(x => keys.Take(20).Contains(x.Id)).ToList();
IQueryable键=
从华盛顿的x开始。测验
让masterID=ParentId.HasValue?ParentId.Value:Id
x组由masterID转换为g组
按g.Max(x=>x.created)降序排列g
选择g键
List=dc.quick.Where(x=>keys.Take(20).Contains(x.Id)).ToList();

这假设答案不是答案的父母。。。如果可以-你手上有一个任意深度的树行走,这对于Linq和SQL来说是一个错误形状的钉子。

你可以尝试在Linq中将表本身连接起来,并创建一个新的对象来保存问题和答案:

var QandA = from q in tbl
        join a in tbl on q.id equals a.fk_parent
        select new {
        QHeader = q.header,
        QBody = q.body,
        QUrl = q.url,
        AHeader = a.header,
        ABody = a.body,
        AUrl = a.url
        };

我想这就是您的表的设置方式,但我可能有连接错误。

我认为这是正确的方法,我尝试将这两个命令合并为一个命令,如下所示:从dc中的x开始。quick let masterID=ParentId.HasValue?ParentId.Value:Id按masterID将x分组为g顺序g按g.Max(x=>x.created)降序选择(新{masterItem}=来自g中的x,其中x.parentid=null}问题是,我有返回值,答案和问题在不同的组中,一个问题的答案与问题不在同一组中。我知道它几乎是相同的,挖掘它。