Performance 查询中LinqToSql自定义函数的执行成本

Performance 查询中LinqToSql自定义函数的执行成本,performance,linq-to-sql,Performance,Linq To Sql,在我的应用程序中,我必须显示一些关于客户的信息(客户有代码和名称)。其中一个字段是“显示名称”,其中 DisplayName = Code + " - " + Name 我将客户从数据库检索到视图模型中,并设置DisplayName,如下所示: from customer in this.Context.Customers select new CustomerViewModel { DisplayName = customer.Code + " - "

在我的应用程序中,我必须显示一些关于客户的信息(客户有代码和名称)。其中一个字段是“显示名称”,其中

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)
它工作正常,使逻辑可重用,但问题是无法将函数解析为SQL语句,因此LinqToSql首先检索数据(“代码”和名称),然后为每个记录执行函数


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

在您的模型中,类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;

您不仅要检索代码和名称,还要检索整个客户实体及其所有数据。这会更慢。这取决于实际有多少数据(多少行?),从性能的角度来看,这可能相关,也可能无关。如果少于1000行,则可能不是


检索更多的列可能会阻止SQLServer使用覆盖索引,因此从这个角度来看,它实际上可能要慢得多。如果你没有这样的索引,区别只在于网络传输没有那么昂贵。

fist语句是否生成了一个好的查询?第二个会生成两个查询吗?大量数据意味着什么:超过一百万?我猜你无论如何都不想同时显示所有的查询,所以我认为你不必担心,除非你得到N+1个查询(配置你的sql以确保)@Bojan:它们都生成一个查询,而且在我看来都是“好的”,但是,在从数据库检索数据之后,第二个数据库必须做一些额外的工作server@SzilardD-档案员怎么说?你比较过他们的执行时间吗?Pleun是对的,没有实际的数据量,一切都是相对的。所以,如果你没有超过百万条记录,那也没什么区别。
var res = from c in this.Context.Customers select c;