2010-08-03 103 views
4

请原谅我,如果这已被问及。我只是刚开始使用LINQ。我有以下表现:如何在另一个表达式中创建表达式?

public static Expression<Func<TblCustomer, CustomerSummary>> SelectToSummary() 
{ 
    return m => (new CustomerSummary() 
    { 
     ID = m.ID, 
     CustomerName = m.CustomerName, 
     LastSalesContact = // This is a Person entity, no idea how to create it 
    }); 
} 

我希望能够以填充LastSalesContact,这是一个Person实体。

我希望填充的细节来自m.LatestPerson,那么我如何映射从m.LatestPersonLastSalesContact的字段。我不想被重复使用的映射,即我不想这样做:

LastSalesContact = new Person() 
{ 
    // Etc 
} 

我可以用一个静态的表达,比如这个:

public static Expression<Func<TblUser, User>> SelectToUser() 
{ 
    return x => (new User() 
    { 
     // Populate 
    }); 
} 

UPDATE:

这是我需要做的:

return m => (new CustomerSummary() 
{ 
    ID = m.ID, 
    CustomerName = m.CustomerName, 
    LastSalesContact = new Person() 
    { 
     PersonId = m.LatestPerson.PersonId, 
     PersonName = m.LatestPerson.PersonName, 
     Company = new Company() 
     { 
      CompanyId = m.LatestPerson.Company.CompanyId, 
      etc 
     } 
    } 
}); 

但我会重新使用Person()创建约10-15个不同的类,所以我不想完全相同的代码重复X次的次数。我可能也想为Company做同样的事情。

回答

1

难道你不能仅仅使用automapper吗?

public static Expression<Func<TblCustomer, CustomerSummary>> SelectToSummary() 
{ 
    return m => Mapper.Map<TblCustomer, CustommerSummary>(m); 
} 

你必须做一些bootstrapping,但它是非常可重用的。

UPDATE:

我可能不会得到什么东西,但它这个功能的目的是什么?如果你只是想将一个或者一个Tbl对象的集合映射到其他对象,为什么要有表达式?

你可能只是有这样的事情:

var customers = _customerRepository.GetAll(); // returns IEnumerable<TblCustomer> 
var summaries = Mapper.Map<IEnumerable<TblCustomer>, IEnumerable<CustomerSummary>>(customers); 

或者是有什么我错过了什么?

+0

我应该澄清,我使用EntityFramework,所以这可能会抛出一些不支持的方法错误。 – GenericTypeTea 2010-08-03 15:01:46

+0

@GenericTypeTea - 为什么?我一直使用automapper和EF。你能发表一个你将如何使用的例子此方法? – Necros 2010-08-03 18:12:43

+0

不起作用:LINQ to Entities无法识别方法'Domain.Models.CustomerSummary Map [TblCustomer,CustomerSummary](Dal.Model.TblCustomer)'方法,并且此方法无法转换为as撕裂表情。我试图在EF Select中使用它。 – GenericTypeTea 2010-08-03 19:27:09

0

我不是认为您将能够使用lambda表达式来做到这一点...您需要使用factory methods in Expression手动构建表达式树。说实话,这不可能是愉快的。

我通常首选的方法是找出如何构建表达式树,首先写一个简单的例子,将您想要做的事写成lambda表达式,然后对其进行反编译。这应该向您展示如何构建表达式树 - 尽管C#编译器可以更容易地使用与属性相关联的元数据(我们必须使用Type.GetProperty)。

这总是假设我已经正确地理解了你......这很有可能我没有。

+0

然后我的微博呼救工作?嘿。我更新了我的问题。 – GenericTypeTea 2010-08-03 10:36:20

+0

@GenericTypeTea:好吧,它看起来像我理解得很好......而且我非常肯定你会*需要编写代码来手动建立表达式。对不起,有坏消息的人( – 2010-08-03 10:41:19

+0

)没问题,没有什么问题,就像在最后端被抛出一样。任何一个小小的答案更新推动我朝着正确的方向的机会吗? – GenericTypeTea 2010-08-03 10:43:36

0

如何:

public static Person CreatePerson(TblPerson data) 
{ 
    // ... 
} 

public static Expression<Func<TblPerson, Person>> CreatePersonExpression() 
{ 
    return d => CreatePerson(d); 
} 


return m => (new CustomerSummary() 
{ 
    ID = m.ID, 
    CustomerName = m.CustomerName, 
    LastSalesContact = CreatePerson(m.LatestPerson) 
}); 
+0

我得到错误'LINQ to Entities不支持LINQ表达式节点类型'Invoke''。 – GenericTypeTea 2010-08-03 15:13:16

+0

@Generic - Doh!我稍后会回来再次尝试。 – ChaosPandion 2010-08-03 15:16:00

+0

谢谢。你让我激动了一会儿。 – GenericTypeTea 2010-08-03 15:17:05