【问题标题】:How call a custom method in lambda expression . I Use Entity Framework 4 . Stored expression error如何在 lambda 表达式中调用自定义方法。我使用实体框架 4 。存储表达式错误
【发布时间】:2010-09-15 13:19:51
【问题描述】:

是否可以在 lambda 表达式中调用自定义方法?

//Address a : It's an Entity
public string AddressConstructor(Address a)
{
    return a.City + "," + a.Province;
}



var Test = _db.MyTableTest.Select( t => new ViewModel
                                   {
                                      MyID = t.ID,
                                      StringAddress = AddressConstructor(t.Addr)
                                   };

【问题讨论】:

    标签: entity-framework lambda entity-framework-4


    【解决方案1】:

    您应该能够使用 LINQKit 将表达式内联到表达式树中来完成此操作。

    http://www.albahari.com/nutshell/linqkit.aspx

    这将导致您尝试在 SQL Server 上而不是在内存中运行的串联(如其他答案中所述)。 SQL Server 当然知道如何连接字符串,但是如果您的 AddressConstructor 做了 SQL Server 不理解的其他操作,那么这种方法将不起作用,您确实需要使用另一种方法中描述的方法在内存中执行您的自定义方法回答。

    本质上 LINQKit 会将树展平,因此它实际上被执行为:

        var Test = _db.MyTableTest.Select( t => new ViewModel
     {
          MyID = t.ID,
          StringAddress = t.Addr.City + "," + t.Addr.Province
     };
    

    哪个 EF 执行应该没有问题(并且连接应该发生在 SQL Server 上)。

    【讨论】:

    • 我会试一试,让你知道。正如您所解释的,我最好在 sql 服务器端执行此任务而不是我的 IIS 服务器。
    • @Jean-Francois,您将永远无法在 SQL Server 上创建 ViewModel 的实例,因为它甚至不知道这种类型...这样的语句无法翻译到 SQL
    • 没错...您将无法在 SQL Server 上创建 ViewModel 的实例。这很愚蠢。但是,我建议他可以连接 SQL Server 上的字符串值,而在您的示例中,您是在内存中进行的。
    • 好的,现在我明白了在 SQL Server 上或在内存中执行操作之间的区别。这两种技术都很好用。
    • Thomas Levesque 建议的方法的一个巨大限制是您将无法在 SQL Server 端的 StringAddress 上进行过滤。您需要返回所有 MyTableTest 并在内存中过滤,以便添加使用 StringAddress 的后续 Where 语句。我建议的方法是您添加一个 .Where(x=>x.StringAddress.Contains("y")) 并在 SQL Server 上执行,而不是返回所有行并在内存中执行。
    【解决方案2】:

    您需要调用AsEnumerable,以便在本地执行投影:

    var Test = _db.MyTableTest.AsEnumerable()
                              .Select( t => new ViewModel
                                       {
                                          MyID = t.ID,
                                          StringAddress = AddressConstructor(t.Addr)
                                       };
    

    否则,使用 Queryable.Select 方法而不是 Enumerable.Select,这会导致 Entity Framework 尝试将 lambda 表达式转换为 SQL 查询(在这种情况下当然不可能)

    【讨论】:

    • 我强烈建议查看下面的答案:stackoverflow.com/a/3718046/88409,它实际上允许这一切都在 SQL Server 中执行。唯一的要求是自定义函数“AddressConstructor”足够简单,可以简化为与 SQL Server 兼容的基本操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2012-10-22
    相关资源
    最近更新 更多