使用非数据库属性创建 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);
使用以下模型:
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);