如果已经提出要求,请原谅我。我刚刚开始使用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.LatestPerson
到LastSalesContact
的字段。我希望映射可以重复使用,即我不想这样做:
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
做同样的事情。
答案 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)
});