C# 在存储过程中使用Linq是否比在生成SQL时使用Linq性能更好?

C# 在存储过程中使用Linq是否比在生成SQL时使用Linq性能更好?,c#,linq,sql-server-2005,linq-to-sql,C#,Linq,Sql Server 2005,Linq To Sql,我对Linq的工作原理没有很好的了解。我只是尝试了一些Linq的例子,这就是为什么我不确定并提出了这个问题 一般说来,网络上的Linq速度很慢。我的问题是,使用SP的Linq是否比使用生成的SQL的Linq具有更好的性能?或者两者都一样 请指导。当然,这取决于您的查询和需要获取的数据量 查询越复杂,LINQ生成的SQL效率就越低 因此,如果您的查询非常复杂/繁重,我建议您使用存储过程/视图,因为从那时起,您将使用DB服务器的强大功能,而不是由LINQ2SQL生成的效率较低的SQL。因为Linq

我对Linq的工作原理没有很好的了解。我只是尝试了一些Linq的例子,这就是为什么我不确定并提出了这个问题

一般说来,网络上的Linq速度很慢。我的问题是,使用SP的Linq是否比使用生成的SQL的Linq具有更好的性能?或者两者都一样


请指导。

当然,这取决于您的查询和需要获取的数据量

查询越复杂,LINQ生成的SQL效率就越低


因此,如果您的查询非常复杂/繁重,我建议您使用存储过程/视图,因为从那时起,您将使用DB服务器的强大功能,而不是由LINQ2SQL生成的效率较低的SQL。

因为Linq to SQL使用一个
QueryProvider
,它将
表达式
转换为SQL语句,对于该提供者执行的每个查询,它都必须这样做(除非该查询是预编译的[更进一步])。例如,在基本层面:

var people = context.People.Where(p => p.Name == "Matt");
Linq to Sql需要将表达式
p=>p.Name==“Matt”
转换为表达式树,然后将其转换为Sql语句,类似于:

SELECT t0.Name FROM People t0 WHERE t0.Name = 'Matt'
对Sql Server执行查询时,Sql Server需要为查询生成执行计划,并对表运行该计划以获得结果。它在为正确的作业创建正确的查询方面非常有效,并且支持更多的数据查询临时方法

对于存储过程,LINQtoSQL不必生成表达式树,并从中生成Sql,相反,设计器生成的类具有将参数从方法传递到存储过程所需的全部信息

从这个意义上讲,使用存储过程更有效,但是您将失去执行这些通常非常有用的特殊查询的能力

您可能会发现,这实际上取决于在数据库中使用存储过程还是直接查询(请与DBA讨论)

已编译查询允许您使用预编译语句(查询只生成一次),因此后续查询将使用先前编译的查询。例如:

public IQueryable<Product> GetProduct(int id)
{
    // Normal query, expression tree and sql generated each time it is
    // it is executed against the data source.
    return context.Products.Where(p => p.Id == id);
}
public IQueryable GetProduct(int-id)
{
//每次创建时都会生成普通查询、表达式树和sql
//它是针对数据源执行的。
返回context.Products.Where(p=>p.Id==Id);
}
鉴于编译查询:

private static readonly Func<DataContext, int, IQueryable<Product>> ProductById = 
    CompiledQuery.Compile((context, id) => 
        context.Products.Where(p => p.Id == id));

public IQueryable<Product> GetProduct(int id)
{
    return ProductById(context, id);
}
private static readonly Func ProductById=
CompiledQuery.Compile((上下文,id)=>
其中(p=>p.Id==Id));
公共IQueryable GetProduct(内部id)
{
返回ProductById(上下文,id);
}

后者将使用预编译查询,因此它只生成一次表达式树和sql。

这取决于执行的sql命令是否相同?