我什么时候应该使用CompiledQuery?

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 :

  • 查询将多次执行,仅根据参数值变化.
  • 查询很复杂,表达式评估和视图生成的成本是"重要的"(试验和错误)
  • 你是不是使用LINQ的功能就像IEnumerable<T>.Contains()一个不会与工作CompiledQuery.
  • 您已经简化了查询,尽可能提供更大的性能优势.
  • 您不打算进一步撰写查询结果(例如,限制或项目),这会产生"反编译"效果.

CompiledQuery它是第一次执行查询时的工作.它对第一次执行没有任何好处.与任何性能调优一样,通常在您确定要修复实际性能热点之前避免它.

2012更新: EF 5将自动执行此操作(请参阅" 实体框架5:控制自动查询编译 ").所以在上面的列表中添加"你没有使用EF 5".


Has*_*san 6

编译的查询可以节省您的时间,这将花费在生成表达式树上.如果经常使用查询并且您将保存已编译的查询,那么您一定要使用它.我有很多情况,当查询解析比实际往返数据库花费更多时间.

在你的情况下,如果你确定它会在SELECT ID, Name FROM Tag没有WHERE大小写的情况下生成(我怀疑,因为你的AllQueries函数应该返回IQueryable,并且实际的查询应该只在调用后进行ToList) - 你不应该使用它.

正如有人提到的那样,在较大的表上SELECT * FROM [someBigTable]花费很长时间,你会花更多的时间在客户端过滤它.因此,无论您是否使用编译查询,都应该确保在数据库端进行过滤.