Linq按List <int>按给定的ID </int>排序

时间:2012-10-01 14:47:26

标签: c# sql linq entity-framework

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

2 个答案:

答案 0 :(得分:7)

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;

这将保持npostIDs没有orderby子句的顺序。如果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;

答案 1 :(得分:5)

接受的答案是正确的,我只是想提供这个答案的方法版本:

IEnumerable<NPost> nposts = repository.NPosts
                            .Where(np => npostIDs.IndexOf(np.NPostID) >= 0)
                            .OrderBy(np => npostIDs.IndexOf(np.NPostID));