加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 什么是EF重写规则?

发布时间:2020-12-15 03:47:32 所属栏目:百科 来源:网络整理
导读:当使用DBContext编写LINQ查询语法表达式时,C#编译器通常会执行 converting the query syntax into dot / extension syntax using its list of 18 transformation / term rewrite rules的魔术.然后,当执行查询时,EF会使用自己的内部重写规则来生成SQL表达式.
当使用DBContext编写LINQ查询语法表达式时,C#编译器通常会执行 converting the query syntax into dot / extension syntax using its list of 18 transformation / term rewrite rules的魔术.然后,当执行查询时,EF会使用自己的内部重写规则来生成SQL表达式.

就像我上面链接的文章一样,我想要列出EF应用的重写规则.在哪里可以找到?如果我知道EF重写规则,我可以预测什么SQL EF将为给定的查询生成,而不必等到运行时才能“看到”生成的SQL.

例如,考虑以下两个查询:

var result = from c in context.Customers
             from a in c.Accounts
             where c.ID > 2
             select a;

var result = from c in context.Customers
             where c.ID > 2
             from a in c.Accounts
             select a;

当C#编译器完成自己的重写规则时,上述查询将被转换为具有以下各种格式的点表示法:

SelectMany(...).Where(...).Select(...); //for the first query

Where(...).SelectMany(...); // for the second query

在这些转换之后,EF可以使用自己的重写规则.但是,对于上述查询,EF具有单一的标准化形式.换句话说,这两个查询将产生相同的结果;任一查询生成以下SQL语句:

SELECT 
    [Extent1].[ID] AS [ID],[Extent1].[Name] AS [Name],[Extent1].[Stat_ID] AS [Stat_ID]
    FROM  [dbo].[Customers] AS [Extent1]
    INNER JOIN [dbo].[Accounts] AS [Extent2] ON [Extent1].[ID] = [Extent2].[Customer_ID]
    WHERE [Extent2].[ID] > 2

不知道EF重写规则,我不能预测.我只需要执行和调试代码来做出这个观察.

那么再一次,在哪里可以找到EF正在应用的重写规则的列表?

我也很好奇EF应用规则的实施策略.这是一篇讨论几个rewrite rule strategies的文章.也许我可以通过研究EF源代码来发现这一点,但是我正在做,但我还没有.

解决方法

将linq表达式转换为SQL不幸的是非常复杂,可能不是很容易地分成一组简单的离散规则.

例如linq GroupBy和Join这样的东西并不倾向于将一个一个地映射到SQL关键字,它们的名称与linq中的行为略有不同,就像在SQL中一样(linq GroupBy返回组中的所有项,而不是只聚合和linq加入更像是SQL Server CROSS APPLY).实际的转换在很大程度上取决于查询结尾所选择的内容,这意味着您通常必须处理整个表达式,而不是简单地将linq方法映射到SQL关键字.

非常值得阅读Matt Warrens关于构建linq提供商http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx的文章.它可能不是EF正在做的,而是让您了解将linq表达式转换为sql和所涉及的复杂性涉及哪些步骤.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读