2010-08-03 104 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