8

リスト[int]で見つかったIDの順序で結果が返されるように、linqクエリをソートしようとしています。これは、それらを正常に返す現在のコードですが、ソートされていません。

IEnumerable<NPost> nposts;

List<int> npostIDs = (from tc in db.TopComs
                      where tc.Type == "Comments"
                      select tc.NPostID).ToList();

            nposts = from np in repository.NPosts
                     where npostIDs.Contains(np.NPostID)
                     select np;

nposts が List[int] に npostIDs が存在する順序で結果を返すようにするにはどうすればよいですか?

4

2 に答える 2

8
IEnumerable<NPost> nposts = from np in repository.NPosts
                            let index = npostIDs.IndexOf(np.NPostID) 
                            where index >= 0
                            orderby index ascending
                            select np;

アップデート

あなたのエラーに基づいて、私は別の提案があります。EFで機能するかどうかは100%わかりませんが、試してみて、私に知らせてください。私が持っているもう1つのアイデアは、うまくいくとわかっていますが、うまく機能しないということです。

IEnumerable<NPost> nposts = from npostID in npostIDs.AsQueryable()
                            join np in repository.NPosts
                            on npostID equals np.NPostID
                            select np;

これにより、句npostIDsなしの順序が維持されます。orderbyが同じである場合ObjectContext(そしておそらくそうでない場合)、実際には1つのクエリでそれを実行できるはずです。ただし、リストをキャッシュしているかどうかは明確ではnpostIDsないため、これはオプションではない可能性があります。とにかく、ここで:

IEnumerable<NPost> nposts = from tc in db.TopComs
                            where tc.Type == "Comments"
                            join np in repository.NPosts
                            on tc.NPostID equals np.NPostID
                            select np;
于 2012-10-01T14:49:52.803 に答える
6

受け入れられた答えは正しいです。この答えのメソッドバージョンを提供したかっただけです:

IEnumerable<NPost> nposts = repository.NPosts
                            .Where(np => npostIDs.IndexOf(np.NPostID) >= 0)
                            .OrderBy(np => npostIDs.IndexOf(np.NPostID));
于 2014-04-09T13:10:42.840 に答える