如何在lambda表达式中调用自定义方法。我使用实体框架4。存储的表达式错误

时间:2010-09-15 13:19:52

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

是否可以在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)
                                   };

2 个答案:

答案 0 :(得分:3)

您应该能够使用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上发生)。

答案 1 :(得分:1)

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

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

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