实体框架/ linq- groupby and a rable



给定以下查询

       public TrainingListViewModel(List<int> employeeIdList)
        {
            this.EmployeeOtherLeaveItemList =
                CacheObjects.AllEmployeeOtherLeaves
                .Where(x => x.OtherLeaveDate >= Utility.GetToday() &&
                    x.CancelDate.HasValue == false &&
                    x.OtherLeaveId == Constants.TrainingId)
                .OrderBy(x => x.OtherLeaveDate)
                .Select(x => new EmployeeOtherLeaveItem
                {
                    EmployeeOtherLeave = x,
                    SelectedFlag = false
                }).ToList();
        }

我想将员工列表放入查询中。我想检索所有X. hoterleavedate值,其中每个JOIN都存在相同的X. hoterleavedate,其中x.EmployeeEid =(int int opporteeeeDlist中的int employeeId)

例如,如果员工列表中的员工1、2、3和cacheObject中的cacheObject.Allemployeotherleaves集合集合所有3名员工的日期1/1/2001,则在该日期进行回顾。

如果我读得很好,那应该是

var grp = this.EmployeeOtherLeaveItemList =
    CacheObjects.AllEmployeeOtherLeaves
    .Where(x => x.OtherLeaveDate >= Utility.GetToday()
             && x.CancelDate.HasValue == false
             && x.OtherLeaveId == Constants.TrainingId
             && employeeIdList.Contains(x.EmployeeId)) // courtesy @IronMan84
    .GroupBy(x => x.OtherLeaveDate);
if (grp.Count() == 1)
{
    var result = g.First().Select(x => new EmployeeOtherLeaveItem
    {
        EmployeeOtherLeave = x,
        SelectedFlag = false
    })
}

首先,数据由OtherLeaveDate分组。如果分组正好在一个组中导致一个组,则采用第一个(和唯一的)IGrouping实例(这是Leave对象的列表),并且其内容投影到EmployeeOtherLeaveItems。

to where语句添加"&amp; emp; emploeeeIdlist.Contains(x.EmployeeEid)"

我需要感谢 @irranman84和@gertarnold帮助我继续前进,我将不得不劝告自己对问题没有更清楚。这是我想出的答案。毫无疑问,它可以得到改进,但是没有人回答说为什么我现在会打勾这个答案。

   var numberOfEmployees = employeeIdList.Count;

var grp = CacheObjects.AllEmployeeOtherLeaves.Where(
                    x =>
                    x.OtherLeaveDate >= Utility.GetToday() 
                    && x.CancelDate.HasValue == false
                    && x.OtherLeaveId == Constants.TrainingId 
                    && employeeIdList.Contains(x.EmployeeId))
                    .GroupBy(x => x.OtherLeaveDate)
                    .Select(x => new { NumberOf = x.Count(), Item = x });
            var list =
                grp.Where(item => item.NumberOf == numberOfEmployees).Select(item => item.Item.Key).ToList();

最新更新