在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());
按日期排序,而不是按演讲者分组。
在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 });
注意,如果你想要一个问题列表作为你的结果,那么最后一个选择是不需要的。