LINQ自引用查询

时间:2010-04-03 06:33:36

标签: linq linq-to-nhibernate

我有以下SQL查询:

select
    p1.[id], 
    p1.[useraccountid], 
    p1.[subject], 
    p1.[message], 
    p1.[views], 
    p1.[parentid], 
    max(
        case
            when p2.[created] is null then p1.[created]
            else p2.[created]
        end
    ) as LastUpdate
from forumposts p1
    left join 
    (
        select 
            id, parentid, created
        from
            forumposts 
    ) p2 on p2.parentid = p1.id 
where 
    p1.[parentid] is null
group by 
    p1.[id], 
    p1.[useraccountid], 
    p1.[subject], 
    p1.[message], 
    p1.[views], 
    p1.[parentid]
order by LastUpdate desc

使用以下课程:

public class ForumPost : PersistedObject
{
    public int Views { get; set; }
    public string Message { get; set; }
    public string Subject { get; set; }        
    public ForumPost Parent { get; set; }
    public UserAccount UserAccount { get; set; }
    public IList<ForumPost> Replies { get; set; }
}

我如何在LINQ中复制这样的查询?我尝试了几种变体,但我似乎无法获得正确的连接语法。这只是一个查询过于LINQ过于复杂的情况吗?是否可以使用嵌套查询来完成某些操作?

查询的目的是查找最近更新的帖子,即回复帖子会将其提升到列表顶部。回复由ParentID列定义,该列是自引用的。

2 个答案:

答案 0 :(得分:0)

LINQ中左连接的语法是:

(我把它放在VB.NET中):

Dim query = From table1 in myTable.AsEnumarable 'Can be a collection of your object
            Group join table2 in MyOtherTable.AsEnumerable 
            On table1.Field(Of Type)("myfield") Equals table2.Field(Of Type)("myfield")
            In temp
            From table2 in temp.DefaultIsEmpty()
            Where table1.Field(Of Type)("Myanotherfield") is Nothing 'exemple
            Select New With { .firstField = table1.Field(Of Type)("Myanotherfield")
                              .secondField = table2.Field(Of Type)("Myanotherfield2")}

像这样的东西

答案 1 :(得分:-1)

我发现NHibernate LINQ支持不包含连接。再加上对复杂LINQ查询的明显缺乏经验,我采取了以下方法:

  • 将修改后的列添加到posts表中。
  • 在回复时,更新父级的已修改列以匹配回复的已创建列
  • 排序并检索已修改列的值以进行后期显示。

考虑到代码的局限性,我认为这是一个相当干净的工作。我非常想避免不得不求助于添加另一个实体,引用视图,或仅使用存储过程+数据表组合来处理这段特定代码。希望保留实体中的所有内容并仅使用NHibernate,并且此修复允许以最小的代码气味发生。

此处留下这个标记作为答案。