2

以下のクエリを考えると

       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();
        }

employeeIdList をクエリに入れたいと思います。x.EmployeeId = (int employeeId in employeeIdList) の結合ごとに同じ x.OtherLeaveDate が存在するすべての x.OtherLeaveDate 値を取得したい

たとえば、employeeIdList と CacheObjects.AllEmployeeOtherLeaves コレクションに EmployeeIds 1、2、3 がある場合、3 人の従業員全員に対して 2001 年 1 月 1 日の日付があり、その日付を取得します。

4

3 に答える 3

2

私があなたをよく読んだら、それは次のようなものになるはずです

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ます。グループ化の結果が正確に1つのグループになる場合、最初の(そして唯一の)IGroupingインスタンス(Leaveオブジェクトのリスト)が取得され、そのコンテンツがsに投影されEmployeeOtherLeaveItemます。

于 2012-10-21T15:20:23.413 に答える
1

where ステートメントに「&& employeeIdList.Contains(x.EmployeeId)」を追加します。

于 2012-10-19T14:51:58.873 に答える
0

私を助けてくれた@IronMan84と@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();
于 2012-10-22T15:02:52.770 に答える