扩展EF4 SQL生成

Bas*_*sic 6 .net extension-methods entity-framework entity-framework-4

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

毋庸置疑,这些都不是理想的,我们有时不得不使用的黑客降低了可读性/可维护性.

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

我用Google搜索了,但也许我使用了错误的术语,因为我得到的是有关EF4 SQL生成新功能的信息.

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

任何帮助/指针赞赏.

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

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

我们使用的是代码优先方法,并有一个控制台应用程序,可以创建数据库并填充一些参考表.

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

关于特定的场景,我担心如果不经过长时间的繁文缛节练习,我就无法从代码中提供一个 - 上面提到链接就是我们想要完成的事情的一个很好的例子.在此示例中,实现允许日期算术的机制:

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)
                };
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ary 9

我建议首先查看EntityFunctions(通用)或SqlFunctions(仅限SQL Server),它们在正常的LINQ to Entities查询中提供了大量内置数据库功能.如果这还不够,可以使用EdmFunctionAttribute映射内置数据库函数或用户定义的存储过程.第三种选择是尝试将其作为实体SQL查询.

您建议的最后一个解决方案 - 编写EF提供程序 - 非常重要.可以编写一个包装现有SQL提供程序的EF提供程序,但您必须至少将一些表达式树更改为Entity SQL.MSDN Code上发布了非常简单的EF提供程序包装器.不过,我认为这是最后的手段.