8

我正在尝试对 linq 查询进行排序,以便按照在 List[int] 中找到的 ID 的顺序返回结果。这是我当前的代码,可以很好地返回它们,但没有排序。

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 按照 npostIDs 在 List[int] 中存在的顺序返回结果?

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;

更新

根据你的错误,我有另一个建议。我不是 100% 确定它是否会在 EF 中工作,但试一试,让我知道。我还有另一个想法,我知道它会起作用,但它不会表现得那么好。

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

这将保持npostIDsorderby子句的顺序。如果ObjectContext是相同的(也许如果不是),您实际上应该能够在单个查询中完成。但是,不清楚您是否正在缓存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 回答