【发布时间】:2017-01-10 13:00:49
【问题描述】:
我正在尝试获取某个日期范围内每个部分的志愿者工作总天数。有一个出勤表,其中包括要映射到成员表的日期和成员 ID。还有一个 section 表来列出所有 section 和一个 membertosection 表,因为一个成员可以在多个 section 中。
我想按成员所在的第一个部分进行分组,然后计算该部分的所有出勤天数。
以下内容在我按成员表上的一对多字段(类别)分组的情况下非常有效,但我不知道如何将其更改为第一部分(如果成员有一个部分)
var result = await _context.Attendance
.Where(p => p.Day >= firstDayOfLastQuarter && p.Day <= lastDayOfLastQuarter)
.GroupBy(p => p.Member.Category.Name)
.Select(p => new { key = p.Key, count = p.Count() })
.ToListAsync();
我正在寻找类似的东西
var result = await _context.Attendance
.Where(p => p.Day >= firstDayOfLastQuarter && p.Day <= lastDayOfLastQuarter && p.Member.MemberToSection.Any(s => s.MemberId == p.MemberId))
.GroupBy(p => p.Member.MemberToSection.First().Section.Name)
.Select(p => new { key = p.Key, count = p.Count() })
.ToListAsync();
更新
产生所需结果的 T-Sql 代码是
SELECT Count(*) as Total, Section.Name
FROM Attendance
LEFT JOIN Member on Attendance.Member_Id = Member.Id
OUTER APPLY (
SELECT TOP(1) sec.id, sec.Name
FROM MemberToSection m2s
LEFT JOIN Section sec ON m2s.Section_Id = sec.Id
WHERE m2s.Member_Id = Member.Id
) as Section
WHERE Attendance.Day >= '2016-10-01' AND Attendance.Day <= '2016-12-31'
GROUP BY Section.Name
“类似”的代码返回错误
An unhandled exception occurred while processing the request.
ArgumentException: Property 'System.String Name' is not defined for type 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer'
类
这里要求的是相关类
出勤率.cs
public partial class Attendance
{
public long Pk { get; set; }
public int MemberId { get; set; }
public DateTime Day { get; set; }
public virtual Member Member { get; set; }
}
会员.cs
public partial class Member
{
public Member()
{
MemberToSection = new HashSet<MemberToSection>();
}
public int Id { get; set; }
public int? CategoryId { get; set; }
public virtual ICollection<MemberToSection> MemberToSection { get; set; }
}
MemberToSection.cs
public partial class MemberToSection
{
public int SectionId { get; set; }
public int MemberId { get; set; }
public virtual Member Member { get; set; }
public virtual Section Section { get; set; }
}
Section.cs
public partial class Section
{
public Section()
{
MemberToSection = new HashSet<MemberToSection>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<MemberToSection> MemberToSection { get; set; }
}
【问题讨论】:
-
能把相关类的映射贴出来吗?
-
您的 something like 查询有什么问题?
-
我不认为你可以这样做:.GroupBy(p => p.Member.MemberToSection.First().Section.Name)。您应该先选择,然后在一个字段上分组。像这样: Where...Select( p=> new { p.Member.MemberToSection.First().Section.Name}).GroupBy ....
标签: c# entity-framework asp.net-core entity-framework-core