.net - 扩展 EF4 SQL 生成

标签 .net entity-framework extension-methods entity-framework-4

我们在一个相当大的系统中使用 EF4,偶尔会遇到问题,因为 EF4 无法将某些表达式转换为 SQL。目前,我们要么需要做一些花哨的工作(DB/代码),要么只是接受性能下降并允许在内存中执行查询。

毋庸置疑,这些都不是理想的,我们有时不得不使用的技巧会降低可读性/可维护性。

理想情况下,我们想要的是一种扩展 EF4 SQL 提供程序的 SQL 生成功能的方法。显然,有一些像 .Net 方法调用这样的东西总是必须在客户端,但是像日期比较这样的一些功能(例如 [在 Linq 中按周分组到 Entities )应该是可行的。

我在谷歌上搜索过,但也许我使用了错误的术语,因为我得到的只是关于 EF4 SQL Generation 的新功能的信息。

对于这样一个灵活且可扩展的框架,如果这是不可能的,我会感到惊讶。在我的脑海中,我正在想象从 [SQL 2008] 提供程序继承并扩展它以处理附加表达式/在它被赋予转换为 SQL 的表达式树中类似。

任何帮助/指针表示赞赏。

我们使用的是 VS2010 Ultimate、.Net 4(非客户端配置文件)和 EF4。该应用程序位于 ASP.Net 中,并在 64 位环境中运行,以防万一。

更新:回应一些澄清请求;

我们正在使用代码优先的方法,并有一个控制台应用程序来创建数据库并填充一些引用表。

我宁愿远离存储过程,除非它们也可以以类似的方式生成 - 目前,新版本的数据库是根据需要生成的,并且一个单独的进程迁移/同步数据。我们目前对数据库所做的一切都使用实体。我承认我不能给出一个很好的理由,但是在这种情况下运行 SQL 脚本来生成存储的过程感觉是错误的 - 但如果我弄错了,请纠正我。

关于特定场景,如果不经过冗长的繁文缛节练习,恐怕我无法从我们的代码中给出一个 - link mentioned above是我们正在努力完成的事情的一个很好的例子。在这个例子中,实现一种允许日期算术的机制:

DateTime firstDay = GetFirstDayOfFirstWeekOfYear();
var userTimes = from t in context.TrackedTimes
                group t by new {t.User.UserName, WeekNumber = (t.TargetDate - firstDay).Days / 7} into ut
                select new
                {
                    UserName = ut.Key.UserName,
                    WeekNumber = ut.Key.WeekNumber,
                    Minutes = ut.Sum(t => t.Minutes)
                };

我可以看到一种方法可以单独使用 SQL 来完成,但不能使用 LINQ-To-Entities(服务器端)来完成。

最佳答案

我建议先看 EntityFunctions (通用)或 SqlFunctions (仅限 SQL Server),它在普通的 LINQ to Entities 查询中提供了许多内置的数据库功能。如果这还不够,您可以使用 EdmFunctionAttribute映射内置数据库函数或用户定义的存储过程。第三种选择是尝试使其作为 Entity SQL 查询工作。

您建议的最后一个解决方案 - 编写 EF 提供程序 - 非常重量级。编写一个封装现有 SQL 提供程序的 EF 提供程序是可能的,但您至少必须将某些表达式树更改为实体 SQL。非常简单的 EF 提供程序包装器已在 MSDN Code 上发布.不过,我会将其视为最后的手段。

关于.net - 扩展 EF4 SQL 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2997993/

相关文章:

c# - 使用最小起订量的扩展方法的单元测试

c# - 支票 21,用 C# .net 图像现金信

C#:检查文件是否未锁定且可写

c# - 无法重命名 Visual Studio 2010 项目

.net - LinqToSql 和 HashBytes

c# - 在 Entity Framework 中使用 'using' 语句的正确方法

c# - Entity Framework Core 2.2 编译查询结构参数在本地评估

entity-framework - 如何使用不同的连接字符串(但相同的数据库)进行迁移

swift - 如何调用具有与此类同名函数的类的静态方法?

c# - 两个 C# 扩展泛型方法之间的调用不明确,其中 T :class and other where T:struct