2011-04-05 178 views
0

我在嘗試改進/重構LINQ to Entities查詢時遇到了一些問題。這是我目前有:LINQ to Entities - 提煉查詢

public List<Article> LastFive() 
{ 
    return _siteDB.Articles.OrderByDescending(a => a.LastModified).Take(5).ToList(); 
} 

我想要做的是,而不是返回五個最新文章的列表,我想簡單地得到最近五個的標題和ID文章。如果可能的話,我希望保持方法鏈完好無損(我喜歡從風格的角度來看),但我不確定要使用方法鏈來爲Select()投放什麼。我也不確定要作爲我的方法的返回值放什麼,因爲我不會返回完整的Article實體,而只是從它們中選擇屬性。 List<IQueryable>

回答

1

這是更好地創建一個類型類:

public class ArticlePreview 
{ 
    public int ID {get;set;} 
    public string Title {get;set;} 
} 

則:

public List<ArticlePreview> LastFive() 
{ 
    return _siteDB.Articles.OrderByDescending(a => a.LastModified) 
        .Take(5).Select(a => new ArticlePreview(){ Title = a.Title, 
                  ID = a.ID }) 
        .ToList(); 
} 

,或者因爲你使用的是C#4.0中,你可以選擇什麼樣的屬性返回:

public static List<dynamic> LastFive(Func<Article, dynamic> func) 
    { 
     return _siteDB.Articles.OrderByDescending(a => a.LastModified) 
        .Take(5).Select(a => func(a)).ToList(); 
    } 

使用它:

var articlePreviews = LastFive(a => new { a.Title, a.ID }); 
//articlePreviews[0].Title 
//articlePreviews[0].ID 
1

您應該返回實際類的列表,但只包含您需要的屬性的類。

public class ArticleTitle 
{ 
    public string Title { get; set; } 
    public int ID { get; set; } 
} 

使您的查詢就會變成:

public List<ArticleTitle> LastFive() 
{ 
    return _siteDB.Articles.OrderByDescending(a => a.LastModified) 
          .Select(a => new ArticleTitle 
          { 
           Title = a.Title, 
           ID = a.ID, 
          }) 
          .Take(5) 
          .ToList(); 
}