从每个类别中获取第一项

Get first item from each category

我有 5 个类别:

图书、DVD、出租、购买、出售

我使用以下查询 select 最新的项目计数。

public async Task<IList<Post>> GetRecentPostsAsync(int count)
{
    return await _db.Posts
        .Where(e => e.Published.HasValue && e.Published.Value <= DateTime.Today)
        .OrderByDescending(e => e.Published)
        .Take(count)
        .ToListAsync();
}

我的 Post class 看起来像这样:

public class Post
{
    #region Properties

    [Key]
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Title { get; set; }

    [Required]
    [StringLength(25)]
    public string Category { get; set; }

    public DateTime? Published { get; set; }

    #endregion
}

这是我的物品数量 return。我想创建一个新功能,从前 4 个类别中获取最近发布的项目,因此不包括销售类别。它应该 return 返回 4 项。

我怎样才能做到这一点?

没有立即理解问题。所以,试试吧。

public async Task<IList<Post>> GetRecentPostsAsync()
        {            
            List<string> categories = new List<string> { "Book", "DVD", "Rent", "Buy" };
            List<Post> result = new List<Post>();

            foreach (string category in categories)
            {
                Post post = db.Posts.Where(e => e.Published.HasValue && e.Published.Value <= DateTime.Today && e.Category == category)
                    .OrderByDescending(e => e.Published)
                    .Take(1).First();
                result.Add(post);
            }

            return result;
        }

试试这个。这将为您提供除销售

之外的类别计数
public class PostCategory 
{
    public string Category { get; set; }
    public int Count { get; set; }
}

public async Task<IList<PostCategory>> GetRecentPostsAsync()
{
    return await _db.Posts
        .Where(e => e.Published.HasValue && e.Published.Value <= DateTime.Today && e.Category != "Sell")
        .GroupBy(x => x.Category)
        .Select(y => new { Category = y.Key, Count = y.Count() })
        .ToListAsync();
}

这应该会给你一个 List<Post>,每个类别中最后发布的 Post 除了“销售”:

return await _db.Posts
        .Where(x => x.Category != "Sell" && x.Published.HasValue && x.Published.Value <= DateTime.Today)
        .GroupBy(x => x.Category)
        .Select(x => x.OrderByDescending(x => x.Published).Take(1))
        .SelectMany(x => x)
        .ToListAsync();