0

我有以下 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 列定义。

4

2 回答 2

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")}

类似的东西

于 2010-04-04T04:32:01.693 回答
-1

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

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

考虑到代码的限制,我认为这是一个非常干净的工作。我非常想避免只为这段特定的代码添加另一个实体、引用视图或使用存储过程 + 数据表组合。希望将所有内容保留在实体中并仅使用 NHibernate,并且此修复程序允许以最小的代码气味发生这种情况。

将其留在这里以稍后标记为答案。

于 2010-04-05T00:45:30.937 回答