2016-03-31 5 views
0

Angenommen, ich habe folgende Einrichtungen und dtoskonvertieren Entity mit Navigationseigenschaft zu DTO mit IQueryable

public class Country 
{ 
    public List<NameLocalized> NamesLocalized; 
    public CountryData Data; 
} 

public class NameLocalized 
{ 
    public string Locale; 
    public string Value; 
} 

public class CountryData 
{ 
    public int Population; 
} 

public class CountryDto 
{ 
    public String Name; 
    public CountryDataDto Data; 
} 

public class CountryDataDto 
{ 
    public int Population; 
} 

I Land CountryDto (und im Idealfall möchte ich eine einzelne Abfrage in der Datenbank machen) zu konvertieren. Ich habe in meinen anderen Fragen zu Stackoverflow einige Anregungen erhalten und kann nun die Aufgabe, aber nur teilweise, erfüllen. Ich bin fest, wie Navigationseigenschaft (CountryData in diesem Fall) konvertieren. Ich wurde vorgeschlagen, LINQKit dafür zu verwenden, aber habe keine Idee, wie man es einführt. Hier ist mein Code, der nur Name Eigenschaft, aber nicht Data Navigationseigenschaft füllt.

public static async Task<List<CountryDto>> ToDtosAsync(this IQueryable<Country> source, string locale) 
{ 
    if(source == null) 
    { 
     return null; 
    } 

    var result = await source 
     .Select(src => new CountryDto 
     {  
      Name = src.NamesLocalized.FirstOrDefault(n => n.Locale == locale).Name 
     }) 
     .ToListAsync(); 

    return result; 
} 

Antwort

0

This Antwort gab mir den Hinweis für meine Lösung. Sie müssen LINQKit verwenden und Expression erstellen, um die Navigationseigenschaft zu konvertieren.

public static Expression<Func<CountryData, CountryDataDto>> ConverterExpression = cd => new CountryDataDto 
     { 
      Population = cd.Population 
     }; 

public static async Task<List<CountryDto>> ToDtosAsync(this IQueryable<Country> source, string locale) 
{ 
    if(source == null) 
    { 
     return null; 
    } 

    var result = await source 
     .AsExpandable 
     .Select(src => new CountryDto 
     {  
      Name = src.NamesLocalized.FirstOrDefault(n => n.Locale == locale).Name 
      Data = ConverterExpression.Invoke(src.Data) 
     }) 
     .ToListAsync(); 

    return result; 
} 
Verwandte Themen