LINQ to Entities - уточнение запроса - PullRequest
0 голосов
/ 05 апреля 2011

У меня возникла небольшая проблема при попытке уточнить / реорганизовать запрос LINQ to Entities. Вот что у меня сейчас есть:

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

Что бы я хотел сделать, вместо того, чтобы возвращать список пяти самых последних статей, я хотел бы просто получить название и идентификатор пяти самых последних статей. Я хотел бы сохранить цепочку методов без изменений, если это возможно (мне это нравится с точки зрения стиля), но я не уверен, что поставить для Select(), используя цепочку методов. Я также не уверен, что указывать в качестве возвращаемого значения моего метода, поскольку я не буду возвращать полные сущности Article, а только выбранные свойства из них. List<IQueryable>

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вероятно, вам следует вернуть список реального класса, но класса, содержащего только те свойства, которые вам нужны.

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();
}
1 голос
/ 05 апреля 2011

Лучше создать типизированный класс:

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
...