gpt4 book ai didi

c# - 使用 Linq to SQL 基于自定义 .NET 属性进行分页和排序

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:19 25 4
gpt4 key购买 nike

这是 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 "";
}
}

假设我有一个按绑定(bind)到该 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,并使其成为返回数据、 View 或其他内容的 SPROC 的一部分。但这对我来说并不合适,因为我将显示逻辑放在我的数据库层中。如果情况比我做作的例子更复杂,并且定义的属性更重要,那就更糟了。

有出路吗,还是我不得不在性能和关注点分离之间做出选择?或者我对数据库中那种显示逻辑的担忧是没有根据的?

最佳答案

LINQ to SQL 想要在服务器上运行查询和排序 - 如果表达式可转换为 SQL,它就可以执行此操作。

您目前的代码不可翻译,这就是您收到错误的原因。

但是,如果您重构查询以计算名称,它将起作用:

var query = from p in db.Persons 
let name = (p.FirstName + " " + p.LastName).Trim
order by name
take 10
select name;

如果您尝试运行它,您会发现 LINQ-to-SQL 可以很好地为您翻译它:

SELECT [t2].[value]
FROM (
SELECT TOP (10) [t1].[value]
FROM (
SELECT LTRIM(RTRIM(([t0].[FirstName] + @p0) + [t0].[LastName])) AS [value]
FROM [dbo].[Persons] AS [t0]
) AS [t1]
ORDER BY [t1].[value]
) AS [t2]
ORDER BY [t2].[value]

但是,如果表格变大,我建议不要这样做。您要求 SQL 重复进行一次计算,理想情况下可以一次完成并存储。考虑一个计算字段 FullName,它存储结果。这将不需要计算并且可以被索引。

关于c# - 使用 Linq to SQL 基于自定义 .NET 属性进行分页和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com