我正在尝试对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的顺序返回结果?
答案 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));