LINQ到实体查询-组中的副本

本文关键字:副本 -组 查询 实体 LINQ | 更新日期: 2023-09-27 18:04:09

我有一个下面的表,它保存了一个移位列表和分配给每个移位的用户,如下所示:

ShiftID | StartDateTime | EndDateTime | AssignedUserID |
-------------------------------------------------------------

我要做的是拉出shiftID的所有班次已分配给用户在同一日期和时间。这是不应该发生的,因为一个人不能同时出现在两个地方……(这个已经排序…现在)

我们在数据库中有一些实例,其中同一用户在同一日期和时间被分配到两个不同的班次。

56 | 06/08/2015 13:00:00 | 06/08/2015 17:00:00 | 22
64 | 06/08/2015 13:00:00 | 06/08/2015 17:00:00 | 22

希望有人能帮助解决这个问题,即使开始拉出在相同开始日期被分配轮班的用户?

public IList<ShiftDate> GetDuplicateShifts()
{
    return _UoW.ShiftDate.Get()
        .ToList();
}

更新

好的,我到达了那里,我现在可以拉出用户在同一天的2个日期的所有用户组,下面的代码可以工作:

public IList<ShiftDate> GetDuplicateShiftsByOrg(int orgID)
{
    IList<ShiftDate> AllDates = _UoW.ShiftDates
        .Get(s => s.Shift.organisationID == orgID)
        .Where(s=>s.assignedUserID != null)
        .ToList();
    var DuplicateDates = new List<ShiftDate> { };
    var groups = AllDates.GroupBy(s=>s.assignedUserID.Value).Where(g => g.Skip(1).Any());
    foreach (var group in groups)
    {
        var group2 = group.GroupBy(sd => sd.shiftStartDate.Date).Where(a => a.Count() > 1).ToList();
        if (group2.Count() > 1)
        {

        ///// REF 1 : this pulls out all shiftdates in group one, I want all shiftdates in group2.
            foreach (ShiftDate shiftDate in group)
            {
                    DuplicateDates.Add(shiftDate);
            }
/////////////////////////////////////////////////////////
        }
    }
    return DuplicateDates.ToList();
}

正如您将在上面的代码REF 1中看到的那样,我想取出group2中的移位日期。然而,当我尝试这样做时,我得到以下错误:

无法强制转换类型为"Grouping[System.DateTime,MySolution.POCO]"的对象。'输入'MySolution.POCO.ShiftDate'.

更新

上面的错误出现是因为我试图从一组移位日期返回一个移位日期,我必须添加一个额外的循环来首先遍历组。参见下面的解决方案

LINQ到实体查询-组中的副本

try this:

var dt=DateTime.Now().ToString("MM/dd/yyyy"); 
var result = from t in Table1
WHERE c.StartDate=dt
SELECT new {c.AssignedUserID};

最后通过使用多个组使其工作,参见下面的工作代码:

 public IList<ShiftDate> GetDuplicateShiftsByOrg(int orgID)
    {
        IList<ShiftDate> AllDates = _UoW.ShiftDates
            .Get(s => s.Shift.organisationID == orgID)
            .Where(s=>s.assignedUserID != null)
            .ToList();
        var DuplicateDates = new List<ShiftDate> { };
        /// 1. Group all shifts assigned to user
        var groupUserShifts = AllDates.GroupBy(s=>s.assignedLocumID.Value).Where(g => g.Skip(1).Any());
        foreach (var group in groupUserShifts)
        {
            /// 2. Group all shifts assigned to user on the same date
            var groupUserSameDates = group.GroupBy(sd => sd.shiftStartDate.Date).Where(a => a.Count() > 1).ToList();

            if (groupUserSameDates.Count() > 1)
            {
                foreach (var dategroup in groupUserSameDates)
                {
                    /// 3. Return all shifts where user hass been assigned on the same date
                    foreach (ShiftDate shiftDate in dategroup)
                    {
                        DuplicateDates.Add(shiftDate);
                    }
                }
            }
        }
        return DuplicateDates.ToList();
    }