使用 IQueryable 将具有导航 属性 的实体转换为 DTO
Convert Entity with navigation property to DTO using IQueryable
假设我有以下实体和 dtos
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;
}
我需要将 Country 转换为 CountryDto(理想情况下,我想对数据库进行一次查询)。我在 Whosebug 上的其他问题中收到的建议很少,现在可以完成任务,但只能部分完成。我被困在如何转换导航 属性(在这种情况下为 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;
}
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;
}
假设我有以下实体和 dtos
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;
}
我需要将 Country 转换为 CountryDto(理想情况下,我想对数据库进行一次查询)。我在 Whosebug 上的其他问题中收到的建议很少,现在可以完成任务,但只能部分完成。我被困在如何转换导航 属性(在这种情况下为 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;
}
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;
}