【发布时间】:2021-01-02 15:20:28
【问题描述】:
我有 500 多条 EventData 记录的列表。 EventData 的模型如下所示
public class EventData
{
public int preEventId { get; set; }
public int empNum { get; set; }
public int EventId { get; set; }
public DateTime CreateDate { get; set; }
public string UserId { get; set; }
}
这里的 EventId 可以是 1、2、3、4 和 5(枚举)。从这个列表中,我想过滤一个月中所有星期的记录,然后计算平均值。注意:weekList 是当月星期一的列表。
(EventId = 1 的记录数)/(EventId = 2 或 5 和 EventId = 1 的 empNum 的记录数(CreateDate 5 天前或更新))
我所做的是:-
int calledCount = lstEventData?.Where(e => e.EventId == 1 &&
e.CreateDate >= weekList.ToList()[week] &&
e.CreateDate <= weekList.ToList()[week].AddDays(4)).Count() ?? 0;
int totalCount = (lstEventData?
.Where(e => (e.EventCd == 2 || e.EventCd == 5) &&
e.CreateDate >= weekList.ToList()[week] &&
e.CreateDate <= weekList.ToList()[week].AddDays(4))
.GroupBy(e => e.empNum)
.Select(x => x.First())
.Count()) ?? 0;
int avgCalls = Convert.ToDecimal(calledCount) / Convert.ToDecimal(totalCount);
相同的示例 SQL 结构:
SELECT * FROM CalledList c INNER JOIN
Events e
ON (c.empNum = e.empNum AND c.EventId IN(2,5)
AND c.CreateDate > e.CreateDate - 5
AND c.EventId = 1
我怎样才能实现我的实际目标?
【问题讨论】:
-
你很可能不需要调用 ToList() (它不是已经是一个列表了吗?),但绝对不应该这样做,因为它在每次迭代中都会发生lstEventData。如果确实需要调用 ToList(),请在 linq 查询之前执行一次并引用新变量。更好的是,由于
week没有改变,只需将 weekList[week] 设置为变量即可。 -
你能更详细地解释你在计算什么吗?您有似乎相互矛盾的信息(例如,“和
empNum's和EventId = 1”是什么意思?你怎么能是一个月的所有星期和CreateDate5 天或更晚? -
另外,你的代码有什么问题?
标签: c# asp.net .net linq lambda