这是关于 ASP.NET 中的自定义分页的问题的后续内容。
假设我定义了一个表:
CREATE TABLE Person
(
ID int identity(1,1) not null primary key,
FirstName varchar(50),
LastName varchar(50)
)
我通过 Linq to SQL 设计器将它映射到一个类。我在Person
类上定义了这个属性:
public string Name
{
get
{
if (FirstName != null && FirstName != "" && LastName != null && LastName != "")
return String.Format("{0} {1}", FirstName, LastName);
else if (FirstName == null || FirstName == "")
return LastName;
else if (LastName == null || LastName == "")
return FirstName;
else
return "";
}
}
假设我有一个按绑定到该 Name 属性的列排序的网格,并且我想做分页。使用 Linq to SQL 做到这一点的自然方法是:
MyDBContext db = new MyDBContext();
var myData = db.Persons.OrderBy(p => p.Name).Skip(pageSize * pageIndex).Take(pageSize);
myGrid.DataSource = myData;
myGrid.DataBind();
但是,Linq to SQL 会在此处引发错误,因为它无法将 Name 属性转换为 SQL。我可以放入.AsEnumerable()
过滤器字符串,正如我刚刚引用的问题的答案中所述,但这意味着我将所有行拉到 Web 服务器并在那里对它们进行排序,如果有足够的记录在桌子。过滤和排序应该发生在数据库中。
简单的答案是将该Name
属性转换为 SQL,并使其成为返回数据、视图或其他东西的 SPROC 的一部分。但这对我来说感觉不对,因为我将显示逻辑放在我的数据库层中。如果情况比我有点做作的例子更复杂,并且定义的属性更不平凡,那就更糟了。
有没有出路,还是我不得不在性能和关注点分离之间做出选择?或者我对数据库中那种显示逻辑的担心是没有根据的?