在c#中使用Linq与相关实体

本文关键字:实体 Linq | 更新日期: 2023-09-27 18:02:08

我需要使用Linq将演讲者的问题列表分组:

public partial class Question
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public string Description { get; set; }
    [ForeignKey("Speaker")]
    public int Speaker_Id { get; set; }
    public virtual Speaker Speaker { get; set; }
}
public partial class Speaker
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }
}

我需要创建一个按演讲者分组的问题列表:

   Question.Date  | Speaker.Name | Question.Description

我到达这里,但它不工作:

db.Questions.Select(c => new
            {
               c.Date,
               c.Description,
               c.Speaker.Id
            })
            .ToList()
            .GroupBy(c => new { c.Id, c.Date, c.Description })
            .Select(g => new Question
            {
                Date = g.Key.Date,
                Speaker = db.Spkeakers.Where(o => o.Id == g.Key.Id).FirstOrDefault(),
                Description = g.Key.Description
            })
            .ToList());

按日期排序,而不是按演讲者分组。

在c#中使用Linq与相关实体

在group by子句中包含Date (DateTime类型)。很有可能每一行都有不同的日期。如果数据的该属性为真,那么按日期分组实际上就是按唯一标识符分组。相反,也许可以尝试通过按日、月、年等分组来按不那么细粒度的日期分组。此外,您还可以按speakerId分组,只按日期排序。

按演讲者和日期排序:

  var result =  db.Questions
                    .OrderBy(t => t.Speaker_Id)
                    .ThenBy(t => t.Date);

这是你如何按演讲者分组并给出一个计数:

  var result =  db.Questions
                    .GroupBy(t => t.Speaker_Id)
                    .Select(g => new { Speaker_Id = g.Key, count = g.Count() });

显示按日期排序的表

  var result = db.Questions
                   .OrderBy(t => t.Date)
                   .Select(item => new { Date = item.Date, Name = item.Speaker.Name, D = item.Description });

注意,如果你想要一个问题列表作为你的结果,那么最后一个选择是不需要的。