2013-03-13 118 views
1

是否可以在LINQ查詢中爲SELECT製作模板?現在我有6方法使用完全相同的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 }) 
}); 
+10

爲什麼不使用具有適當構造函數的類? – 2013-03-13 10:25:41

+0

嘗試一些像AutoMapper的mappers,但也與Tim的建議 – TalentTuner 2013-03-13 10:28:10

+0

所以我可以創建一個類爲我創建選擇? – user2049921 2013-03-13 10:31:45

回答

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

A這裏有一個例子說明如何在需要執行轉換的地方使用它:

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

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