C# LINQ:从投影内的嵌套列表中获取总计数
我有以下LINQ声明:C# LINQ:从投影内的嵌套列表中获取总计数,c#,linq,count,nested-properties,C#,Linq,Count,Nested Properties,我有以下LINQ声明: var branchStatus = (from b in context.Branches join l in context.Lobbies on b.BranchId equals l.BranchId into branchLobbyDetails from bl in branchLobbyDetails.DefaultIfEmpty() where (branches.Count == 0 || branches.Contains(bl
var branchStatus = (from b in context.Branches
join l in context.Lobbies on b.BranchId equals l.BranchId into branchLobbyDetails
from bl in branchLobbyDetails.DefaultIfEmpty()
where (branches.Count == 0 || branches.Contains(bl.BranchId))
&& b.IsActive
&& (bl == null ? true : bl.IsActive && !bl.IsArchived)
group bl by new { b.BranchId, b.BranchName } into grouped
select new BranchStatusDetailsDto
{
Id = grouped.Key.BranchId.ToString(),
BranchName = grouped.Key.BranchName,
WaitingInLobby = (grouped.Any() && grouped.First() != null) ? grouped.Count(l => l.Status == 1).ToString() : defaultEmpty,
TotalPSProvided = (grouped.Any() && grouped.First() != null) ? grouped.Where(l => l.Status != 6).Select(l => l.ServicesProvided).Count().ToString() : defaultEmpty,
AverageAssistTime = (grouped.Any() && grouped.First() != null) ? grouped.Where(l => l.Status == 5).Select(l => (TimeSpan)(l.CompletedTime - l.AssistedTime)).Average().ToString() : string.Empty
});
我基本上是在收集列表中每个分支的统计数据。在projection语句中,第一次计算(WaitingLobble
)没有问题,我对提供的TotalPSProvidered
和AverageAssistTime
有问题
对于每个分支机构,可以有多个大厅记录,并且每个大厅记录可以有0个或多个提供的服务
条目。使用TotalPSProvided
我想获得每个分支机构的总记录,但我得到的结果不正确-似乎在当前查询中,它给出了大厅记录的数量作为TotalPSProvided
如何修改语句以返回正确的stat
添加实体定义:
public partial class Branch
{
public int BranchId { get; set; }
public string BranchName { get; set; }
public string BranchCode { get; set; }
public string TimeZoneId { get; set; }
public bool IsActive { get; set; }
public DateTime LastModifiedDate { get; set; }
}
public partial class Lobby
{
public Lobby()
{
this.ServicesRequested = new List<ServicesRequested>();
this.ServicesProvided = new List<ServicesProvided>();
}
[Key]
[Required]
public long LobbyId { get; set; }
[Required]
[ForeignKey("Branch")]
public int BranchId { get; set; }
[ForeignKey("UserRequested")]
public int? RequestedUserId { get; set; }
[ForeignKey("GroupRequested")]
public int? RequestedGroupId { get; set; }
[ForeignKey("AddedByUser")]
public int? AddedByUserId { get; set; }
[ForeignKey("AssistedByUser")]
public int? AssistedByUserId { get; set; }
[MaxLength(1000)]
public string Comments { get; set; }
[Required]
public DateTime? AddedTime { get; set; }
public DateTime? AssistedTime { get; set; }
public DateTime? CompletedTime { get; set; }
[Required]
public bool IsActive { get; set; }
public bool IsArchived { get; set; }
//[ForeignKey("LobbyStatus")]
public int Status { get; set; }
[MaxLength(50)]
public string AccountNumber { get; set; }
[MaxLength(50)]
[Required]
public string FirstName { get; set; }
[MaxLength(50)]
[Required]
public string LastName { get; set; }
//[ForeignKey("Appointment")]
public long? FkAppointmentId { get; set; }
[MaxLength(150)]
public string Notes { get; set; }
[MaxLength(20)]
public string PhoneNumber { get; set; }
[MaxLength(50)]
public string EmailAddress { get; set; }
[MaxLength(2)]
//[Required]
[ForeignKey("PreferredLanguage")]
public string PreferredLanguageKey { get; set; }
[Required]
public bool ClosedByAutoWrapUp { get; set; }
/// <summary>
/// Stores the requested services as a pre-calculated string to support sorting
/// </summary>
public string RequestedServices { get; set; }
public DateTime? AddedLocalTime { get; set; }
public DateTime? AssistedLocalTime { get; set; }
public DateTime? CompletedLocalTime { get; set; }
[MaxLength(4)]
public string AccountNoLastFourDigits { get; set; }
[Required]
public DateTime LastModifiedDate { get; set; }
public virtual Branch Branch { get; set; }
public virtual User UserRequested { get; set; }
public virtual Group GroupRequested { get; set; }
public virtual User AssistedByUser { get; set; }
public virtual Language PreferredLanguage { get; set; }
public virtual List<ServicesProvided> ServicesProvided { get; set; }
public virtual List<ServicesRequested> ServicesRequested { get; set; }
}
public partial class ServicesProvided
{
[Key]
[Required]
public long ServiceProvidedId { get; set; }
[Required]
[ForeignKey("Lobby")]
public long LobbyId { get; set; }
[Required]
[ForeignKey("Service")]
public int ServiceId { get; set; }
[Required]
public DateTime LastModifiedDate { get; set; }
public virtual Lobby Lobby { get; set; }
public virtual Service Service { get; set; }
}
公共部分类分支
{
公共整数{get;set;}
公共字符串BranchName{get;set;}
公共字符串分支代码{get;set;}
公共字符串TimeZoneId{get;set;}
公共bool IsActive{get;set;}
公共日期时间LastModifiedDate{get;set;}
}
公共部分班级大厅
{
公共大厅()
{
this.ServicesRequested=新列表();
this.ServicesProvided=新列表();
}
[关键]
[必需]
公共长游说ID{get;set;}
[必需]
[外键(“分行”)]
公共整数{get;set;}
[外键(“用户请求”)]
public int?RequestedUserId{get;set;}
[ForeignKey(“GroupRequested”)]
public int?RequestedGroupId{get;set;}
[外键(“AddedByUser”)]
公共int?AddedByUserId{get;set;}
[外键(“助手”)]
公共int?AssistedByUserId{get;set;}
[最大长度(1000)]
公共字符串注释{get;set;}
[必需]
公共日期时间?AddedTime{get;set;}
public DateTime?AssistedTime{get;set;}
公共日期时间?CompletedTime{get;set;}
[必需]
公共bool IsActive{get;set;}
公共布尔是归档的{get;set;}
//[ForeignKey(“LobbyStatus”)]
公共int状态{get;set;}
[MaxLength(50)]
公共字符串AccountNumber{get;set;}
[MaxLength(50)]
[必需]
公共字符串名{get;set;}
[MaxLength(50)]
[必需]
公共字符串LastName{get;set;}
//[外键(“任命”)]
public long?FkAppointmentId{get;set;}
[MaxLength(150)]
公共字符串注释{get;set;}
[MaxLength(20)]
公共字符串PhoneNumber{get;set;}
[MaxLength(50)]
公共字符串电子邮件地址{get;set;}
[MaxLength(2)]
//[必需]
[外键(“首选语言”)]
公共字符串PreferredLanguageKey{get;set;}
[必需]
公共bool closedbyautorrapup{get;set;}
///
///将请求的服务存储为预先计算的字符串,以支持排序
///
公共字符串RequestedServices{get;set;}
public DateTime?AddedLocalTime{get;set;}
public DateTime?AssistedLocalTime{get;set;}
公共日期时间?CompletedLocalTime{get;set;}
[MaxLength(4)]
公共字符串AccountNoLastFourDigits{get;set;}
[必需]
公共日期时间LastModifiedDate{get;set;}
公共虚拟分支分支{get;set;}
公共虚拟用户userrequest{get;set;}
公共虚拟组GroupRequested{get;set;}
公共虚拟用户AssistedByUser{get;set;}
公共虚拟语言首选语言{get;set;}
公共虚拟列表服务提供{get;set;}
请求的公共虚拟列表服务{get;set;}
}
已提供公共部分类服务
{
[关键]
[必需]
公共长服务提供ID{get;set;}
[必需]
[外键(“大厅”)]
公共长游说ID{get;set;}
[必需]
[外键(“服务”)]
public int ServiceId{get;set;}
[必需]
公共日期时间LastModifiedDate{get;set;}
公共虚拟大厅{get;set;}
公共虚拟服务服务{get;set;}
}
我认为这是您查询中的一个输入错误,您正在计算提供的服务
而不是将它们相加,您正在这样做:
TotalPSProvided = (grouped.Any() && grouped.First() != null) ? grouped.Where(l => l.Status != 6).Select(l => l.ServicesProvided).Count().ToString() : defaultEmpty,
与此相反:
TotalPSProvided = (grouped.Any() && grouped.First() != null) ? grouped.Where(l => l.Status != 6).Sum(l => l.ServicesProvided).ToString() : defaultEmpty,
我认为这是您的查询中的一个输入错误,您正在计算提供的
服务
,而不是将它们相加,您正在这样做:
TotalPSProvided = (grouped.Any() && grouped.First() != null) ? grouped.Where(l => l.Status != 6).Select(l => l.ServicesProvided).Count().ToString() : defaultEmpty,
与此相反:
TotalPSProvided = (grouped.Any() && grouped.First() != null) ? grouped.Where(l => l.Status != 6).Sum(l => l.ServicesProvided).ToString() : defaultEmpty,
TotalPSProvided
的问题如下:
grouped.Where(l => l.Status != 6).Select(l => l.ServicesProvided).Count()
在这里,您只需计算满足where条件的(分支、大厅)对的数量
返工成:
TotalPSProvided = (grouped.Any() && grouped.First() != null)
? grouped.Where(l => l.Status != 6)
.Sum(l => l.ServicesProvided.Count()).ToString()
: defaultEmpty,
TotalPSProvided
的问题如下:
grouped.Where(l => l.Status != 6).Select(l => l.ServicesProvided).Count()
在这里,您只需计算满足where条件的(分支、大厅)对的数量
返工成:
TotalPSProvided = (grouped.Any() && grouped.First() != null)
? grouped.Where(l => l.Status != 6)
.Sum(l => l.ServicesProvided.Count()).ToString()
: defaultEmpty,
你能添加你的实体吗<代码>分支机构和大厅您可以添加您的实体吗<代码>分支机构和大厅谢谢,这是我的错误。谢谢,这是我的错误。