Bru*_*oLM 22 c# asp.net entity-framework compiled-query
我有一张桌子:
-- Tag
ID | Name
-----------
1 | c#
2 | linq
3 | entity-framework
Run Code Online (Sandbox Code Playgroud)
我有一个类将有以下方法:
IEnumerable<Tag> GetAll();
IEnumerable<Tag> GetByName();
Run Code Online (Sandbox Code Playgroud)
在这种情况下我应该使用编译查询吗?
static readonly Func<Entities, IEnumerable<Tag>> AllTags =
CompiledQuery.Compile<Entities, IEnumerable<Tag>>
(
e => e.Tags
);
Run Code Online (Sandbox Code Playgroud)
然后我的GetByName方法是:
IEnumerable<Tag> GetByName(string name)
{
using (var db = new Entities())
{
return AllTags(db).Where(t => t.Name.Contains(name)).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
它生成SELECT ID, Name FROM Tag并执行Where代码.或者我应该避免CompiledQuery在这种情况下?
基本上我想知道何时应该使用编译查询.此外,在网站上,他们只为整个应用程序编译一次?
Cra*_*ntz 31
CompiledQuery当满足以下所有条件时,您应该使用a :
IEnumerable<T>.Contains()一个不会与工作CompiledQuery.CompiledQuery它是第一次执行查询时的工作.它对第一次执行没有任何好处.与任何性能调优一样,通常在您确定要修复实际性能热点之前避免它.
2012更新: EF 5将自动执行此操作(请参阅" 实体框架5:控制自动查询编译 ").所以在上面的列表中添加"你没有使用EF 5".
编译的查询可以节省您的时间,这将花费在生成表达式树上.如果经常使用查询并且您将保存已编译的查询,那么您一定要使用它.我有很多情况,当查询解析比实际往返数据库花费更多时间.
在你的情况下,如果你确定它会在SELECT ID, Name FROM Tag没有WHERE大小写的情况下生成(我怀疑,因为你的AllQueries函数应该返回IQueryable,并且实际的查询应该只在调用后进行ToList) - 你不应该使用它.
正如有人提到的那样,在较大的表上SELECT * FROM [someBigTable]花费很长时间,你会花更多的时间在客户端过滤它.因此,无论您是否使用编译查询,都应该确保在数据库端进行过滤.
| 归档时间: |
|
| 查看次数: |
12623 次 |
| 最近记录: |