0

これは私の(簡略化された)コードです:

コントローラ

var userQuery = from u in _db.Users
                where u.Username.ToLower().Contains(search.ToLower())
                    || u.FirstName.ToLower().Contains(search.ToLower())
                    || u.LastName.ToLower().Contains(search.ToLower())
                select u.FirmID;

var query = from f in _db.Firms
            where f.Name.ToLower().Contains(search.ToLower()) 
                || f.Keyword.ToLower().Contains(search.ToLower()) 
                    || f.KeywordList.ToLower().Contains(search.ToLower())
                    || userQuery.Contains(f.ID)
            select f;

// order by firm name
query = query.OrderBy(f => f.Name);

ユーザーモデル

public class User
{
    [Key]
    public int ID { get; set; }

    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int FirmID { get; set; }
    [ForeignKey("FirmID")] 
    public virtual Firm Firm { get; set; }
}

企業モデル

public class Firm
{
    [Key]
    public int ID { get; set; }

    public string Keyword { get; set; }
    public string KeywordList { get; set; }
    public string Name { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

このコードを使用して、特定の検索文字列に一致するユーザーを持つ企業のリストを取得します。リストは会社名順に並んでいます。私が今やりたいことは、ユーザーの姓でもソートすることです。どうやってやるの?

今:

  • 会社
    • ユーザーb
    • ユーザーa
    • ユーザー c
  • b社
    • ユーザー z
    • ユーザーd

希望:

  • 会社
    • ユーザーa
    • ユーザーb
    • ユーザー c
  • b社
    • ユーザーd
    • ユーザー z
4

2 に答える 2

1

このようにしてみました

query.OrderBy(f => f.Name).Select(aux => new 
{
   Firm = aux.Firm,
   Users = aux.Users.OrderBy( x => x.Username )
})
于 2012-05-29T21:07:46.497 に答える
0

さて、私は最終的に私にとって最良の解決策を見つけました:

query.OrderBy(f => f.Name)
     .ToList()
     .ForEach(f => f.Users = f.Users.OrderBy(u => u.LastName).ToList() );

つまり、匿名の選択オブジェクト (Jorge の回答など) を作成する必要がないため、ビューでのモデルの処理がはるかに簡単になります。

別の解決策は、コントローラーではなくビューでユーザーをソートすることです。例えば:

@foreach (var user in Model.Users.OrderBy(u => u.LastName)) {  }
于 2012-05-31T16:04:37.883 に答える