使用非数据库属性创建 PagedList

Create PagedList with non database properties

使用以下模型:

public class Person
{
    public int PersonId { get; set; }

    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Display(Name = "Middle Name(s)")]
    public string MiddleNames { get; set; }

    public string Surname { get; set; }

    public string Name
    {
        get
        {
            List<string> name = new List<string>();
            name.Add(this.FirstName);
            name.Add(this.MiddleNames);
            name.Add(this.Surname);
            return String.Join(" ", name.Where(n => !String.IsNullOrEmpty(n)));
        }
    }
}

我想创建一个 PagedList 如下所示的视图模型:

public class PersonSearch
{
    public int PersonId { get; set; }
    public string Name { get; set; }
}

最有效的方法是什么?

我不能使用下面的,因为它给我一个名称错误,这是预期的

var model = db.person.OrderBy(p => p.Surname)
                    .ThenBy(p => p.FirstName)
                    .Select(p => new PersonSearch
                    {
                        PersonId = p.PersonId,
                        Name = p.Name
                    })
                    .ToPagedList(page, 25);

The specified type member 'Name' is not supported in LINQ to Entities

以下有效,但它首先显示了整个人员列表:

var model = db.person.OrderBy(p => p.Surname)
                    .ThenBy(p => p.FirstName)
                    .ToList()
                    .Select(p => new PersonSearch
                    {
                        PersonId = p.PersonId,
                        Name = p.Name
                    })
                    .ToPagedList(page, 25);

并且以下内容不起作用,因为它删除了分页信息:

var model = db.person.OrderBy(p => p.Surname)
                    .ThenBy(p => p.FirstName)
                    .ToPagedList(page, 25);
                    .Select(p => new PersonSearch
                    {
                        PersonId = p.PersonId,
                        Name = p.Name
                    })
                    .ToPagedList(page, 25);

向您的 PersonSearch 模型添加一个构造函数,以便您可以生成全名

public class PersonSearch
{
  public PersonSearch()
  {
  }
  public PersonSearch(string first, string middle, string last)
  {
    // format and remove leading or trailing white space as a result of nulls
    string name = string.Format("{0} {1} {2}", first, middle, last).Trim();
    // remove any internal extra white space if middle is null
    if (string.IsNullOrWhiteSpace(middle))
    {
      name = String.Join(" ", name.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
    }
    Name = name;
  }
  public int PersonId { get; set; }
  public string Name { get; set; }
}

然后在您的查询中使用

var model = db.person.OrderBy(p => p.Surname).ThenBy(p => p.FirstName)
  .Select(p => new PersonSearch(p.FirstName, p.MiddleNames, p.Surname)
  {
    PersonId = p.PersonId
  }).ToPagedList(page, 25);