【发布时间】:2011-08-16 17:03:51
【问题描述】:
这是this question 关于 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 会在此处引发错误,因为它can't convert the Name property to SQL。我可以将.AsEnumerable() 放入过滤器字符串中,正如我刚刚引用的问题的答案中所述,但这意味着我将所有行都拉到 Web 服务器并在那里对其进行排序,如果有足够的,这并不理想表中的记录。过滤和排序应该发生在数据库中。
简单的答案是将Name 属性转换为SQL,并使其成为返回数据、视图或其他东西的SPROC 的一部分。但这对我来说感觉不对,因为我将显示逻辑放在我的数据库层中。如果情况比我有点做作的例子更复杂,并且定义的属性更不平凡,那就更糟糕了。
有没有出路,还是我不得不在性能和关注点分离之间做出选择?还是我对数据库中那种显示逻辑的担心是没有根据的?
【问题讨论】:
标签: c# asp.net linq-to-sql custompaging