0

これにはあなたの助けが必要です。

存在する場合は、最初の返信日時を OrderBy にしようとしています。空/null の場合は、トピックの日時順に並べる必要があります。私は次の式になりましたが、うまくいかないようです:(

return db.Topics
.Where(t => t.ForumID == id)
.OrderBy(
    t => t.Replies
    .OrderBy(r => r.AddDatetime.Equals(System.Data.SqlTypes.SqlDateTime.Null.Value) ? t.AddDatetime : r.AddDatetime)
    .Select(r => r.AddDatetime)
    .First()
);
4

3 に答える 3

1

POCO オブジェクトを返すことに耐えられる場合は、次のことができます。

var pocoenum = db.Topics
.Where(t => t.ForumID == id)
.Select(
new {
    ...
    AddDatetime = t.Replies.Select(r => r.AddDateTime).FirstOrDefault == null ? t.AddDatetime : t.Replies.Max(r => r.AddDateTime)
};

return pocoenum.OrderBy(p => p.AddDatetime)

ただし、SQL は最も美しいとは言えません。

于 2009-10-12T14:13:36.183 に答える
1

なぜあなたはただできないのですか

return db.Topics .Where(t => t.ForumID == id) .OrderBy( t.Replies.Min(r=>(DateTime?)r.AddDateTime) ?? t.AddDateTime) .Select(r => r .AddDatetime) .First()

r.AddDatetime 自体が null 可能である場合は、キャストを削除できます。それ以外の場合は、Min 関数が DateTime を返すことを確認するためにそのキャストが必要ですか? DateTimeではなく

于 2010-01-11T00:48:23.657 に答える
0

OrderBy ごとに 1 つずつ、合計 2 つの Linq ステートメントが必要です。If ステートメントを使用して、返す Linq ステートメントを決定します。

既存のコードの問題は、ラムダがフィールドへの参照を期待しているのに、三項演算の結果が値であることです。

于 2009-10-10T16:16:49.590 に答える