我试图让每个部门的志愿者在日期范围之间完成人工日。有一个出勤表,其中包括要映射到成员表的日期和成员ID。还有一个用于列出所有部分的部分表,以及一个成员可以在多个部分中的membertosection表。
我想按成员所在的第一部分进行分组,然后计算该部分的所有出勤日数。
以下内容适用于我在成员表上按1到多个字段(类别)进行分组但我无法解决如何将其更改为第一部分(如果成员有一个部分)
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
&#34;&#34;类似&#34;代码返回错误
An unhandled exception occurred while processing the request.
ArgumentException: Property 'System.String Name' is not defined for type 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer'
这里要求的是相关的课程
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; }
}
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; }
}
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; }
}
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; }
}
答案 0 :(得分:1)
(目前已合并)EF documentation以Compare EF Core & EF6.x部分开头,其中包含非常“有用”的主题Which One Is Right for You。嗯,貌似EF Core不适合你(还)。以下内容适用于此时最新的EF Core v1.1.0。
首先,GroupBy
(即使是简单的原始属性)总是在内存中处理。
其次,在处理像你这样的非常有效的LINQ查询时,会有很多内部错误导致异常。
第三,经过一些试验和错误后,以下等效构造适用于您的情况(至少不会产生异常):
.GroupBy(p => p.Member.MemberToSection.Select(m => m.Section.Name).FirstOrDefault())
(顺便说一句,与此问题无关,s => s.MemberId == p.MemberId
调用中的p.Member.MemberToSection.Any
条件是多余的,因为它是由关系强制执行的,所以简单的Any()
也会这样做。)< / p>
但现在不仅GroupBy
在内存中执行,而且查询导致N + 1 SQL查询类似于EF Core nested Linq select results in N + 1 SQL queries。恭喜:(