2011-12-22 40 views
2

在我的应用程序中,我必须显示一些关于客户的信息(客户有代码和名称)。其中一个字段是“显示名称”,其中查询中的LinqToSql自定义函数的执行成本

DisplayName = Code + " - " + Name 

我从数据库中检索客户到视图模型,并设置显示名称,像这样:

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

第一个语句是否会生成一个好的查询?第二个产生两个查询吗? – TheBoyan 2011-12-22 09:47:58

+0

“很多数据的含义”是什么:超过一百万?无论如何,猜猜你不想同时显示它们,所以我不认为你需要担心,除非你得到N + 1个查询(配置你的sql来确认) – Pleun 2011-12-22 09:50:42

+0

@Bojan:都会生成一个查询,并且在我的意见都是'好',但第二个必须做一些额外的工作后,从服务器上检索到的数据 – SzilardD 2011-12-22 17:06:26

回答

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; 
0

您检索不仅代码和名称,但其所有数据的整个客户实体。这会变慢。取决于实际的数据量(有多少行),从性能的角度来看,这可能会或可能不相关。如果你的行数少于1000行,它可能不是。

检索更多的列可以防止SQL Server使用覆盖索引,所以从这个角度来看,它实际上可能会慢很多。如果您无论如何都没有这样的索引,那么差别只在于网络传输并不昂贵。