代码之家  ›  专栏  ›  技术社区  ›  Basic

扩展ef4sql生成

  •  5
  • Basic  · 技术社区  · 16 年前

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

    不用说,这两种方法都不理想,我们有时不得不使用的黑客技术降低了可读性/可维护性。

    理想情况下,我们想要的是一种扩展ef4sql提供程序的SQL生成功能的方法。很明显,有些东西像.Net方法调用,它必须始终是客户端的,但是有些功能像日期比较(例如,在Linq中按周分组,以便 Entities

    对于这样一个灵活和可扩展的框架,如果这是不可能的,我会感到惊讶。在我的脑海中,我想象着从[SQL2008]提供者继承并扩展它来处理额外的表达式/类似的表达式树,它被赋予了转换为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来实现这一点,但不能看到如何使用linqto实体(服务器端)来实现这一点。

    2 回复  |  直到 9 年前
        1
  •  9
  •   jtate    8 年前

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

    MSDN Code . 不过,我会把这当作最后的手段。

        2
  •  1
  •   Community Mohan Dere    9 年前

    从基于.NET的LINQ查询到SQL的转换由 LINQ到实体提供程序 . 我认为核心翻译/编译过程极其复杂,是不可扩展的。您必须从头开始编写自己的提供者。

    我还没有遇到任何可以用SQL表示而不能用LINQ表示的查询。如果您确实有一个很难作为LINQ查询编写的查询,您是否考虑过使用存储过程来代替它?如果您能提供一些无法转换的查询的示例,这会有所帮助。

    另一个选择是创建高级扩展方法,这些方法使用自定义表达式来形成查询。下面是一个很好的示例,它模拟Contains()函数来执行“where in”类型查询:

    'Contains()' workaround using Linq to Entities?

    推荐文章