Linq to SQL:カスタムソート

1931 ワード

ある時、私たちはある特定のシーケンスに従って結果の並べ替えを完了する必要があります。例えば、in条件のId順に記事を返します。
この順序で並べ替えます。1,5,2,6,3,7,4,9
SQL文は以下の通りです
select * from pdt_Music where MusicID in(1,2,3,4,5,6,7,8,9)
order by CHARINDEX(RTRIM(CAST(MusicID as NCHAR)),'5,2,8,1,3,4,6,7,9')
C葃中LIQ文は以下の通りです。
public object AAA()
{
    List<Music> list = new List<Music>();
    var num = "1,4,3,2,5".Split(',').Select(v => Convert.ToInt32(v)).ToArray();
    var query = db_C56.Musics.Where(w => num.Contains(w.MusicID)).Select
        (mm => new
        {
            MusicID = mm.MusicID,
            MusicName = mm.MusicName,
            MusicUrl = mm.MusicUrl,
            CreateBy = mm.CreateBy,
            Status = mm.Status
        }).ToList();
    list = query.OrderBy(a => Array.IndexOf(num.Reverse().ToArray(), a.MusicID)).Select(s => new Music
    {
        MusicID = s.MusicID,
        MusicName = s.MusicName,
        MusicUrl = s.MusicUrl,
        CreateBy = s.CreateBy,
        Status = s.Status
    }).Skip(0).Take(10).ToList();
    return list;
}

public List<Music> BBB()
{
    List<Music> list = new List<Music>();
    var num = "1,2,3,4,5".Split(',').Select(v => Convert.ToInt32(v)).ToArray();
    var aa = (from m in db_C56.Musics
              where num.Contains(m.MusicID) && m.Status != "D"
              orderby m.MusicID
              select new
              {
                  m.MusicID,
                  m.MusicName,
                  m.MusicUrl,
                  CreateBy = m.CreateBy,
                  Status = m.Status
              }).ToList();
    list = aa.OrderBy(a => Array.IndexOf(num.Reverse().ToArray(), a.MusicID)).Select(s => new Music
    {
        MusicID = s.MusicID,
        MusicName = s.MusicName,
    }).Skip(0).Take(10).ToList();
    return list;
}