Linq按列表的顺序<int>给出的ID

Ada*_*ick 8 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;
Run Code Online (Sandbox Code Playgroud)

我怎样才能让nposts以List [int]中存在npostID的顺序返回结果?

sma*_*man 7

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

更新

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

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

这将保持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;
Run Code Online (Sandbox Code Playgroud)

  • 我个人喜欢一种名为`IndefOx` :)的方法 (2认同)

DLe*_*Leh 5

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

IEnumerable<NPost> nposts = repository.NPosts
                            .Where(np => npostIDs.IndexOf(np.NPostID) >= 0)
                            .OrderBy(np => npostIDs.IndexOf(np.NPostID));
Run Code Online (Sandbox Code Playgroud)