【问题标题】:EF Pre Compile query and return of a scalar valueEF Pre Compile 查询并返回一个标量值
【发布时间】:2011-11-25 09:59:16
【问题描述】:

我使用 asp.net 4 c# 和 ef4。

我有这段代码,它应该编译一个查询并返回一个标量值(我使用匿名类型)。

我的代码没有明显的错误,但因为是我第一次编写编译查询,所以我想知道是否写得好或可以改进以提高性能。

   var query = CompiledQuery.Compile((CmsConnectionStringEntityDataModel ctx)
                        => from o in ctx.CmsOptions
                           where o.OptionId == 7
                           select new
                           {
                               Value = o.Value
                           });

                    uxHtmlHead.Text = query(context).FirstOrDefault().Value;// I print the result in a Label

SQL 配置文件输出:

SELECT TOP (1) 
[Extent1].[OptionId] AS [OptionId], 
[Extent1].[Value] AS [Value]
FROM [dbo].[CmsOptions] AS [Extent1]
WHERE 7 = [Extent1].[OptionId]

非常感谢


Wouter 建议后的结果(请大家再次检查):

        static readonly Func<CmsConnectionStringEntityDataModel, int, string> compiledQueryHtmlHead =
    CompiledQuery.Compile<CmsConnectionStringEntityDataModel, int, string>(
            (ctx, id) => ctx.CmsOptions.FirstOrDefault(o => o.OptionId == id).Value);


using (var context = new CmsConnectionStringEntityDataModel())
            {
                int id = 7;
                uxHtmlHead.Text = compiledQueryHtmlHead.Invoke(context, id);
            }

生成的 SQL(我不明白为什么要使用 LEFT JOIN)

exec sp_executesql N'SELECT 
[Project1].[Value] AS [Value]
FROM   ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN  (SELECT 
    [Extent1].[Value] AS [Value]
    FROM [dbo].[CmsOptions] AS [Extent1]
    WHERE [Extent1].[OptionId] = @p__linq__0 ) AS [Project1] ON 1 = 1',N'@p__linq__0 int',@p__linq__0=7

【问题讨论】:

    标签: c# linq entity-framework-4


    【解决方案1】:

    有两点可以改进。

    首先,预编译查询绝对是一个好主意,但如果您查看您的代码,您会发现它每次都预编译查询,而不是只预编译一次。

    您需要将预编译的查询移动到只初始化一次的静态变量。

    您需要注意的另一件事是,在预编译查询时,您不应该在执行之前再修改查询。

    您正在构建一个将选择所有行的预编译查询,然后您说“firstordefault”将预编译查询更改为 SELECT TOP (1),您将失去预编译的好处。您需要在预编译查询中移动 FirstOrDefault 部分并仅返回一个结果。

    查看this 文档。如果您查看示例,您可以看到它们如何使用静态字段来保存已编译的查询以及它们如何指定返回值。

    【讨论】:

    • 再次感谢 Wouter 的支持!
    • 您能发布生成的代码吗?对其他人来说会很好:)
    • 已发布代码 :-),如果现在更有意义,请 Wouter 看看。我使用了 Func 并在方法中包含了 FirstOrDefault。我唯一不明白的是生成的 Sql 中的 LEFT OUTER JOIN。你有想法吗?非常感谢您的帮助!
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多