通常将IQueryable列表转换为dto对象列表

时间:2016-01-11 13:42:26

标签: c# .net web-applications asp.net-web-api

背景

我有一个转换IQueryable<>列表的扩展方法到IEnumerable<>:

public static IEnumerable<PersonDto> ToDtoList(
    this IQueryable<Person> source)
{
    var result = new List<PersonDto>();

    foreach (var item in source)
    {
        result.Add(item.ToDto());
    }

    return result;
}

item.ToDto扩展程序执行此操作:

public static PersonDto ToDto(this Person source)
{
    if (source == null)
        return null;

    return new PersonDto
    {
        PersonId = source.personId,
        Firstname = source.firstname,
        Lastname = source.lastname,
        DateOfBirth = source.dateOfBirth,
        CreateDate = source.createDate,
        ModifyDate = source.modifyDate,
    };
}

问题

有没有办法配置以下内容以便item.ToDto()有效?

public static IEnumerable<T2> ToDtoList<T, T2>(this IQueryable<T> source)
{
    var result = new List<T2>();

    foreach (var item in source)
    {
        result.Add(item.ToDto());
    }

    return result;
}

原样,它不起作用,因为.ToDtoitem无法解析的符号。

1 个答案:

答案 0 :(得分:1)

问题(你可能知道)是如何&#34;一般&#34;将T映射到T2

您可以使用AutoMapper之类的工具,您可以将其配置为在任意两种类型之间进行一般映射,或者您可以为映射函数添加参数:

public static IEnumerable<T2> ToDtoList<T, T2>(this IQueryable<T> source, Func<T, T2> map)
{
    var result = source.AsEnumerable()  // to avoid projecting the map into the query
                       .Select(s => map(s));

    return result;
}