在我的应用程序中,我必须显示一些有关客户的信息(客户有代码和名称)。其中一个字段是'display name',其中
DisplayName = Code + " - " + Name
我将客户从数据库检索到视图模型并设置DisplayName,如下所示:
from customer in this.Context.Customers
select new CustomerViewModel
{
DisplayName = customer.Code + " - " + customer.Name
}
但是我想将这个逻辑提取到一个表达式或函数中,因为我在多个地方使用它,如果逻辑发生了变化(例如DisplayName = Name),那么我必须做很多改动。
因此,我创建了这个功能
Func<Customer, string> CustomerDisplayName = (c => c.Code + " - " + c.Name)
并以这种方式使用它:
from customer in this.Context.Customers
select new CustomerViewModel
{
DisplayName = CustomerDisplayName(customer)
}
它工作正常并使逻辑可重用,但问题是该函数无法解析为SQL语句,因此LinqToSql首先检索数据('Code'和Name'),然后为每条记录执行该函数。
我是否应该担心性能(如果我有大量数据),并坚持使用第一个选项?或者可以使用该功能吗?
答案 0 :(得分:2)
在您的模型中,您有Customer类,它是一个部分类(请参阅文件yourDataClasses.designer.cs)。
因此,您只需要修改文件yourDataClases.cs,添加部分类Customer并将其添加到属性DisplayName。
yourDataClases.cs中的代码如下所示:
public partial class Customer
{
public int DisplayName
{
get
{
return this.Code + " - " + this.Name;
}
}
}
您的查询会很好:
var res = from c in this.Context.Customers select c;
答案 1 :(得分:0)
您不仅要检索代码和名称,还要检索整个Customer实体及其所有数据。这会慢一些。取决于实际数据的数量(行数?),从性能角度来看,这可能相关也可能不相关。如果行数少于1000行,可能不是。
检索更多列可能会阻止SQL Server使用覆盖索引,因此从这个角度来看它可能实际上要慢得多。如果你还没有这样的索引,那么区别仅在于网络传输并不昂贵。