选择模板

时间:2013-03-13 10:23:34

标签: c# linq select

是否可以在SELECT查询中为LINQ制作模板?现在我有6方法使用完全相同的SELECT,我想尽可能使用模板。

这是我正在使用的代码,当我想对select进行更改时,我必须在代码中的很多地方更改相同的内容。

result = query.Select(b => new
{
    route_id = b.b.route_id,
    name = b.b.name,
    description = b.b.description,
    distance = b.b.distance,
    distance_to_route = (int)b.distance_to_from_me,
    departure_place = b.b.departure_place,
    arrival_place = b.b.arrival_place,
    owner = b.b.user.username,
    average_rating = b.avg_rating,
    is_favorite = b.is_favorite,
    date = b.b.date,
    attributes = b.b.route_attributes.Select(c => 
        c.route_attribute_types.attribute_name),
    coordinates = b.b.coordinates.Select(c => 
        new coordinateToSend { sequence = c.sequence, 
            lat = c.position.Latitude, 
            lon = c.position.Longitude })
});

1 个答案:

答案 0 :(得分:1)

以下是一种可以实现此目的的简单示例:

在您的示例中,您将源类型转换为匿名类型。您可以创建一个类来表示转换/结果类型,例如:

    public class ResultClass
    {
        public string ResultPropA { get; set; }
    }

为了举例,我们可以说以下是源类的定义:

    public class SourceClass
    {
        public string SourcePropA { get; set; }
    }

现在您已拥有源和结果对象的类型定义,您可以创建一个扩展方法,将源类的集合转换为结果类的集合:

    public static class SourceToResultRepository
    {
        public static IEnumerable<ResultClass> ConvertSourceToResult
            (this IEnumerable<SourceClass> source)
        {
            return source.Select(s => new ResultClass
            {
                ResultPropA = s.SourcePropA
                //Add all other property transformations here
            });
        }
    }

以下是您可以在需要执行转换的地方使用它的示例:

 //Extension usage:
 var result = Database.Source.ConvertSourceToResult();

 //Direct usage:
 var result = SourceToResultRepository.ConvertSourceToResult(Database.Source);