由于EF4无法将某些表达式转换为SQL,因此我们在相当大的系统中使用EF4并偶尔遇到问题。目前,我们或者需要做一些奇特的步法(DB/Code),或者只是接受性能命中,并允许查询在内存中执行。扩展EF4 SQL生成
不用说,这些都不是理想的,我们有时不得不使用的黑客降低可读性/可维护性。
我们理想的想法是扩展EF4 SQL提供程序的SQL生成功能。很明显,有些东西就像.Net方法调用一样必须是客户端,但是一些功能比如日期比较(例如[Linq到Entities的星期几组)应该可用。
我已经谷歌搜索,但也许我使用错误的术语,因为我所得到的是有关EF4 SQL生成的新功能的信息。
对于这样一个灵活和可扩展的框架,如果这是不可能的,我会感到惊讶。在我的脑海中,我想象着从[SQL 2008]提供者继承,并将其扩展为处理其转换为SQL的表达式树中的其他表达式/类似表达式。
任何帮助/指针赞赏。
我们使用VS2010 Ultimate,.Net 4(非客户端配置文件)和EF4。该应用程序在ASP.Net,并在64位环境中运行,以防有所作为。
更新:回应一些澄清要求;
我们使用的是代码优先的方法,并有一个控制台应用程序来创建数据库并填充一些引用表。
我宁愿远离存储过程,除非它们也可以以类似的方式生成 - 目前,根据需要生成数据库的新版本,并且单独的过程会迁移/同步数据。 一切我们目前正在处理数据库使用实体。我承认我不能给出一个很好的理由,但是在这种情况下运行SQL脚本来生成存储过程感觉不对 - 但是如果我错了,请纠正我的错误。
关于具体情况,恐怕我不能在没有经过冗长的繁文exercise节练习的情况下从我们的代码中提供一个代码 - 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到实体(服务器端)做它来完成。
很难回答这样一个抽象的问题。你正准备支持什么呢?有很多种方法来做这些事情(EdmFunctions,商店查询,执行文字SQL等)。 – 2010-06-08 14:15:08
确实 - 我已经扩展了这个问题来包含一个例子。我希望这更清楚? – Basic 2010-06-08 16:51:25