2011-06-28 109 views
1

我有以下設置LINQ to SQL和自動映射

  • LINQ到SQL數據上下文
  • 數據傳輸對象(DTO的),我用它來從我的業務層將數據傳遞到我的UI。

我的DTO的典型用法是將數據庫中的表連接起來,這樣我就可以向我的UI傳遞一個包含連接結果的數據對象。

我有類似下面的代碼(這是顯著從實際的代碼減少SO張貼在)...

IQueryable<CustomerEventDto> query = (
    from ce in db.CustomerEvents 
    join cet in db.CustomerEventTypes on ce.CustomerEventTypeId equals cet.CustomerEventTypeId 
    join c in db.Customers on ce.PidCreating equals c.Pid 
    join c in db.Countries on ce.CountryId equals c.CountryId             
    join t in db.TimeZones on ce.TimeZoneId equals t.TimeZoneId 
    where ce.Pid == pid 
    select new CustomerEventDto() 
    { 
     ApprovedHR = ce.ApprovedHR, 
     City = ce.City, 
     Closed = ce.Closed, 
     CountryId = ce.CountryId, 
     CountryCode = c.CodeISO3166Alpha2, 
     CreatorForename = c.CustomersUnique.Forename, 
     CreatorSurname = c.CustomersUnique.Surname, 
     CreatorUsername = c.UserName, 
     Email = ce.Email, 
     EventDateTime = ce.DateTime, 
     EventType = ce.CustomerEventTypeId, 
     EventTypeDescription = cet.Detail, 
     LockedOutSecurity = ce.LockedOutSecurity, 
     LockedOutSuspension = ce.LockedOutSuspension, 
     TimeZoneDifference = t.Difference, 
     TimeZoneId = ce.TimeZoneId, 
     TimeZoneName = t.ZoneName 
    }); 

    query = query 
     .OptionalWhere(from, ce => (ce.EventDateTime >= from.StartOfDayNullable())) 
     .OptionalWhere(to, ce => (ce.EventDateTime <= to.StartOfDayNullable())) 
     .OptionalWhere(eventType, ce => (ce.EventType == eventType)); 
    return query.ToList(); 

有沒有我可以使用自動映射器來做到這一點映射的方法?

+0

你可能想整理你的代碼,你的縮進太大了。它現在的樣子真是難以理解。 –

回答

0

我假設你是指你的db對象到CustomerEventDto對象的映射吧?

簡答:是的,它應該是可能的。

較長的回答:是的,你應該能夠使用AutoMapper進行這些轉換,只有設置會有點複雜,我認爲。也許它會開箱即用...

嗯,我正在寫一個小代碼的例子,但寫它時,我意識到它可能不會那麼容易,因爲它似乎,因爲你想投影幾個DB對象到1 CustomerEventDto對象。我認爲複雜的設置可能不值得麻煩...

所以我現在的結論是,這是不可能的。如果您或其他人確實找到解決方案,請將其發佈,以便我將來也可以使用此技術!

對不起,我不能有任何幫助。

2

當我必須使用大量的預測,分組和條件來填充一個DTO我使用數據庫視圖並在視圖中執行這些任務。這將消除使用對象映射工具的複雜性,並且您的datacontext將返回隨時可用的對象

+1

然而,在這個項目中,我試圖使用更多的基於代碼的方法。 – Remotec

1

在@kgolovchenko上對LINQ Projector project的回答展開看起來像AutoMapper最近添加了此功能。

var model = entites.Query().To<EntityModel>() 
        .Where(m => m.Name.StartsWith("One")) 
        .First();