LINQ to Entities - 改进查询

时间:2011-04-05 00:22:48

标签: asp.net-mvc-2 select c#-4.0 linq-to-entities

我在尝试优化/重构LINQ to Entities查询时遇到了一些问题。这是我现在拥有的:

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

我想做的是,我想简单地获取最近五篇文章的标题和ID,而不是返回最近五篇文章的列表。如果可能的话,我想保持链接完整的方法(从风格的角度来看我喜欢它),但是我不确定使用方法链接为Select()添加什么。我也不确定将什么作为我的方法的返回值,因为我不会返回完整的文章实体,而只返回它们中的选定属性。 List<IQueryable>

2 个答案:

答案 0 :(得分: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 :(得分:1)

您应该返回一个实际类的List,但是只包含您需要的属性的类。

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