2

少し混乱しており、助けが必要です。この2つのクラスを受講してください

public class Comment
{
     public string Message {get; set;}
     public DateTime Created {get; set;}
}

public class Post
{
    public int PostId {get; set;}
    public string Content {get; set;}
    public IList<Comment> Comments {get; set;}
}

単一の投稿を返しますが、コメントの作成日順に並べ替えられる linq クエリを作成したいと考えています。

そこで、次のように linq クエリの作成を開始しました。

var query = from p in _repository.GetPosts()
                        where p.PostId == id
                        orderby p.Comments.Select(x => x.Created)
                        select p;

            return query.Single();

しかし、orderby ステートメントは機能していないようです。リストをデフォルトのソート順で返すだけです。これを機能させる方法について何か提案はありますか??? 前もって感謝します!

4

5 に答える 5

4

どのコメント日付で並べ替えますか? 最初?最後?あなたは試してみてください:

orderby p.Comments.Max(x=>x.Created)

例えば。

また、正確にSingle1行を期待することをお勧めします。その場合、それをソートする意味はあまりありません。ということですか?First()


それとも、並べ替えたいということですCommentsか?その場合、Post最初のものを取得します。

Post post = ...

さて...あなたのせいでソートCommentsは少し難しいですIList<T>-少し非効率であることを気にしないのであれば、これは簡単です:

post.Comments = post.Comments.OrderBy(x=>x.Created).ToList();

もちろん、 が だった場合CommentsList<T>、次のように実行できます。

post.Comments.Sort((x, y) => (x.Created.CompareTo(y.Created)));

フォームの拡張メソッドを作成するために実行できるトリックもあります。

post.Comments.Sort(x=>x.Created);

すなわち

public static void Sort<TSource, TKey>(
    this List<TSource> source,
    Func<TSource, TKey> selector)
{
    var comparer = Comparer<TKey>.Default;
    source.Sort((x, y) => comparer.Compare(selector(x), selector(y)));
}
于 2009-01-15T10:45:56.303 に答える
1

あなたの orderby プロジェクションはIEnumerable<DateTime>- を返していますが、それはあなたが望むものではないようです。

投稿に多くのコメントが含まれています。作成日を使用して注文するコメントとして、どれを使用しますか? 私の推測は最初です:

var query = from p in _repository.GetPosts()
                    where p.PostId == id
                    orderby {
                        Comment comment = p.Comments.FirstOrDefault();
                        return comment == null ? DateTime.MinValue : comment.Created;
                    }
                    select p;
于 2009-01-15T10:46:05.600 に答える
1

これは、同等の値ではない IEnumerable コレクションで返されます。

p.Comments.Select(x => x.Created)

代わりにこれを試してください:

p.Comments.Max(x => x.Created)

最新のコメントの日付を返す

于 2009-01-15T10:46:45.660 に答える
0

結果のコメントのリストを並べ替えたい場合は、投稿を取得した後に次のように実行できます。

p.Comments = p.Comments.OrderBy(x => x.Created).ToList();

.

于 2009-01-15T10:51:14.107 に答える
0

問題は、コメントのリストをソートするのではなく、コメント作成日のリストで投稿のリストをソートしようとしていることです。

あなたの質問を正しく読んだ場合、単一の投稿を取得してから、その投稿内のコメントを並べ替えたいと思います。それを行うには、次のことを試してください。

var query = from p in _repository.GetPosts()
            where p.PostId == id
            orderby p.Comments.Select(x => x.Created)
            select p;

var ret = query.Single();
ret.Comments = ret.Comments.OrderBy(x => x.Created).ToList();
return ret;
于 2009-01-15T10:54:49.233 に答える