【发布时间】:2016-05-27 21:30:11
【问题描述】:
我在下面有一个大代码块,实际代码并不那么重要,但包含在内是为了演示我正在尝试做的事情。
我有一个公共静态表达式> GetFreeSpotCount(...)
这个方法返回一个我想在另一个方法中重用的表达式
表达式本身返回一个数字,表示 [model] 列表中满足特定条件的 [model] 的数量。
我希望新方法返回上面数字大于 0 的所有 [model]。
下面是我目前的代码,我想避免重复这么多代码
public static Expression<Func<ExamTimeSlot, int>> GetFreeSpotCountFor(List<Guid> drivingSchoolIds)
{
return ets =>
ets.Participants
- ets.Exams.Where(ex => ex.Status == ExamStatus.Pending).Count(e => !ets.ExamTimeSlotReservations.Any(r => r.DrivingSchoolId == e.BookedByDrivingSchoolId))
- ((int?)ets.ExamTimeSlotReservations.Sum(r => (ets.Exams.Where(ex => ex.Status == ExamStatus.Pending).Where(e => e.BookedByDrivingSchoolId == r.DrivingSchoolId).Count()
- r.ReservedSpots) > 0 ? (ets.Exams.Where(ex => ex.Status == ExamStatus.Pending).Where(e => e.BookedByDrivingSchoolId == r.DrivingSchoolId).Count() - r.ReservedSpots) : 0) ?? 0)
- ((int?)ets.ExamTimeSlotReservations.Sum(r => r.ReservedSpots) ?? 0)
+ ((((int?)ets.ExamTimeSlotReservations.Where(r => drivingSchoolIds.Any(id => r.DrivingSchoolId == id)).Sum(r => r.ReservedSpots) ?? 0)
- ets.Exams.Where(ex => drivingSchoolIds.Any(id => ex.BookedByDrivingSchoolId == id) && ex.Status == ExamStatus.Pending).Count()) >= 0 ?
(((int?)ets.ExamTimeSlotReservations.Where(r => drivingSchoolIds.Any(id => r.DrivingSchoolId == id)).Sum(r => r.ReservedSpots) ?? 0)
- ets.Exams.Where(ex => drivingSchoolIds.Any(id => ex.BookedByDrivingSchoolId == id) && ex.Status == ExamStatus.Pending).Count())
: 0);
}
和:
public static Expression<Func<ExamTimeSlot, bool>> GetExamTimeSlotsWithFreeSpotsFor(List<Guid> drivingSchoolIds)
{
return ets =>
(ets.Participants
- ets.Exams.Where(ex => ex.Status == ExamStatus.Pending).Count(e => !ets.ExamTimeSlotReservations.Any(r => r.DrivingSchoolId == e.BookedByDrivingSchoolId))
- ((int?)ets.ExamTimeSlotReservations.Sum(r => (ets.Exams.Where(ex => ex.Status == ExamStatus.Pending).Where(e => e.BookedByDrivingSchoolId == r.DrivingSchoolId).Count()
- r.ReservedSpots) > 0 ? (ets.Exams.Where(ex => ex.Status == ExamStatus.Pending).Where(e => e.BookedByDrivingSchoolId == r.DrivingSchoolId).Count() - r.ReservedSpots) : 0) ?? 0)
- ((int?)ets.ExamTimeSlotReservations.Sum(r => r.ReservedSpots) ?? 0)
+ ((((int?)ets.ExamTimeSlotReservations.Where(r => drivingSchoolIds.Any(id => r.DrivingSchoolId == id)).Sum(r => r.ReservedSpots) ?? 0)
- ets.Exams.Where(ex => drivingSchoolIds.Any(id => ex.BookedByDrivingSchoolId == id) && ex.Status == ExamStatus.Pending).Count()) >= 0 ?
(((int?)ets.ExamTimeSlotReservations.Where(r => drivingSchoolIds.Any(id => r.DrivingSchoolId == id)).Sum(r => r.ReservedSpots) ?? 0)
- ets.Exams.Where(ex => drivingSchoolIds.Any(id => ex.BookedByDrivingSchoolId == id) && ex.Status == ExamStatus.Pending).Count())
: 0)) > 0;
}
我想做这样的事情:
public static Expression<Func<ExamTimeSlot, bool>> GetExamTimeSlotsWithFreeSpotsFor(List<Guid> drivingSchoolIds)
{
return ets => GetFreeSpotCountFor(drivingSchoolIds) > 0;
}
我曾尝试将 Expression.GreaterThan 与第一个表达式一起使用,但由于我需要结果 AND [model],因此我无法找到使其工作的方法。
【问题讨论】:
-
您不应该使用 ` 来转义代码(例如,对于一大段文本中的单个类名)使用正确的代码格式(每行标识 4 个空格)以便我们得到从现在开始带有格式的正确代码视图(将为您编辑它,但下次记住它)
-
啊,stackoverflow 速度的乐趣,其他人在最后 13 秒内修复了它,哈哈
-
谢谢,我错过了关于缩进的部分,以后会确保使用它。
-
我敢冒险,您需要更进一步地进行此练习,并将看起来可怕的 lambda 中的逻辑分解成更易于消化的块。我会非常担心维护这样一个单一的 Winnebago 逻辑。
标签: c# linq lambda expression