我有以下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列定义,该列是自引用的。
答案 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查询的明显缺乏经验,我采取了以下方法:
考虑到代码的局限性,我认为这是一个相当干净的工作。我非常想避免不得不求助于添加另一个实体,引用视图,或仅使用存储过程+数据表组合来处理这段特定代码。希望保留实体中的所有内容并仅使用NHibernate,并且此修复允许以最小的代码气味发生。
此处留下这个标记作为答案。