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 クエリの経験が明らかに不足しているため、次の回避策に頼りました。

  • posts テーブルに Modified 列を追加します。
  • 返信時に、親の Modified 列を更新して、返信の Created 列と一致するようにします
  • 投稿表示用に Modified 列の値を並べ替えて取得します。

コードの制限を考えると、これはかなりクリーンな回避策だと思います。別のエンティティを追加したり、ビューを参照したり、この特定のコードに対してのみストアド プロシージャとデータ テーブルの組み合わせを使用したりする必要はありません。エンティティ内にすべてを保持し、NHibernate のみを使用したかったのですが、この修正により、最小限のコード臭でそれが可能になります。

これをここに残して、後で回答としてマークします。

于 2010-04-05T00:45:30.937 に答える