2016-03-31 5 views
0

私は、エンティティとDTOSの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; 
} 

私はCountryDtoに国を変換する必要があります(理想的に、私は、データベースへの単一のクエリを作成したい)を、次のしていると仮定使用してDTOにナビゲーションプロパティを持つエンティティに変換します。私はStackoverflowに関する他の質問にいくつかの提案を受け取りましたが、今はタスクを部分的にしか達成できません。私はナビゲーションプロパティ(この場合はCountryData)を変換する方法についていません。私はこのためにLINQKitを使用することを提案されましたが、それをどのように実装するかは考えていません。ここには、Nameプロパティのみが設定され、Dataナビゲーションプロパティは設定されません。

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; 
} 

答えて

0

This回答は私の解決策のヒントを与えました。ナビゲーションプロパティを変換するには、LINQKitを使用してExpressionをビルドする必要があります。

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; 
}