如何在另一个表达式中创建表达式?

时间:2010-08-03 10:03:22

标签: linq c#-4.0 lambda

如果已经提出要求,请原谅我。我刚刚开始使用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
    });
 }

更新

这就是我需要做的事情:

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
       }
    }
});

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

3 个答案:

答案 0 :(得分:1)

你不能只使用automapper吗?

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

你必须做一些自举,但那时它是非常可重用的。

<强>更新

我可能没有得到什么,但这个功能的目的是什么?如果您只想将一个或一组Tbl对象映射到其他对象,为什么要使用表达式?

你可以这样:

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

或者我错过了什么?

答案 1 :(得分:0)

我不认为你将能够使用lambda表达式来执行此操作...您需要使用factory methods in Expression手动构建表达式树。说实话,这不太可能是愉快的。

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

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

答案 2 :(得分: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)
});