Как я могу создать выражение в другом выражении? - PullRequest
4 голосов
/ 03 августа 2010

Простите, если об этом уже спрашивали.Я только начал использовать 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
}

Могу ли я использовать статическое выражение, такое как:* ОБНОВЛЕНИЕ:

Это то, что мне нужно сделать:

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.

Ответы [ 3 ]

1 голос
/ 03 августа 2010

Разве вы не можете просто использовать 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);

Или я что-то пропустил

0 голосов
/ 03 августа 2010

Как насчет этого:

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 голосов
/ 03 августа 2010

Я не думаю вы сможете использовать лямбда-выражение для этого ... вам нужно будет вручную построить дерево выражений, используя фабричные методы вExpression.Честно говоря, вряд ли это будет приятно.

Мой обычно предпочтительный способ построения деревьев выражений - это начать с простого примера того, что вы хотите сделать, записав его как лямбда-выражение, а затемдекомпилируй это.Это должно показать вам, как строится дерево выражений - хотя компилятор C # получает возможность использовать метаданные, связанные со свойствами, проще, чем мы (мы должны использовать Type.GetProperty).

Это всегда предполагает, что I 'Я правильно тебя понял ... вполне возможно, что я не понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...