查询中LinqToSql自定义函数的执行开销

时间:2011-12-22 09:36:28

标签: performance linq-to-sql

在我的应用程序中,我必须显示一些有关客户的信息(客户有代码和名称)。其中一个字段是'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'),然后为每条记录执行该函数。

我是否应该担心性能(如果我有大量数据),并坚持使用第一个选项?或者可以使用该功能吗?

2 个答案:

答案 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使用覆盖索引,因此从这个角度来看它可能实际上要慢得多。如果你还没有这样的索引,那么区别仅在于网络传输并不昂贵。