C# LINQ到实体查询-在组中重复

C# LINQ到实体查询-在组中重复,c#,entity-framework,linq,C#,Entity Framework,Linq,下表列出了班次列表以及分配给每个班次的用户,如下所示: ShiftID | StartDateTime | EndDateTime | AssignedUserID | ------------------------------------------------------------- 我试图做的是为在同一日期和时间分配给用户的所有班次拉出shiftID。这不应该发生,因为一个人不能同时在两个地方…(这一个已经被分类了…) 我们的数据库中有一些实例,其中同一用户被分配在同一日期和时间的两

下表列出了班次列表以及分配给每个班次的用户,如下所示:

ShiftID | StartDateTime | EndDateTime | AssignedUserID |
-------------------------------------------------------------
我试图做的是为在同一日期和时间分配给用户的所有班次拉出shiftID。这不应该发生,因为一个人不能同时在两个地方…(这一个已经被分类了…)

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

e、 g

希望有人能在这方面提供帮助,哪怕是在同一开始日期调出轮班的用户

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

好了,我就到了,我现在可以提取出用户在同一天的两个日期的所有用户组,代码如下:

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();
}
public IList GetDuplicateShiftsByOrg(int orgID)
{
IList AllDates=\u UoW.ShiftDates
.Get(s=>s.Shift.organizationId==orgID)
.Where(s=>s.assignedUserID!=null)
.ToList();
var DuplicateDates=新列表{};
var groups=AllDates.GroupBy(s=>s.assignedUserID.Value)。其中(g=>g.Skip(1.Any());
foreach(组中的var组)
{
var group2=group.GroupBy(sd=>sd.shiftStartDate.Date).Where(a=>a.Count()>1.ToList();
如果(group2.Count()>1)
{
/////参考1:这将拉出第一组中的所有轮班人员,我想要第二组中的所有轮班人员。
foreach(ShiftDate ShiftDate在组中)
{
重复日期。添加(移位日期);
}
/////////////////////////////////////////////////////////
}
}
返回重复的日期。ToList();
}
正如您将在代码中的参考1中看到的那样,我想在第2组中取出移位日期。但是,当我尝试执行此操作时,会出现以下错误:

无法将“Grouping[System.DateTime,MySolution.POCO.ShiftDate]”类型的对象强制转换为“MySolution.POCO.ShiftDate”类型

更新

出现上述错误是因为我试图从一组轮班日期返回一个轮班日期,我必须先添加一个额外的循环来循环这些组。请参阅下面的解决方案尝试以下方法:

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

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();
    }
public IList GetDuplicateShiftsByOrg(int orgID)
{
IList AllDates=\u UoW.ShiftDates
.Get(s=>s.Shift.organizationId==orgID)
.Where(s=>s.assignedUserID!=null)
.ToList();
var DuplicateDates=新列表{};
///1.将分配给用户的所有班次分组
var groupUserShifts=AllDates.GroupBy(s=>s.assignedocomid.Value)。其中(g=>g.Skip(1.Any());
foreach(GroupUserShift中的var组)
{
///2.对同一日期分配给用户的所有班次进行分组
var groupUserSameDates=group.GroupBy(sd=>sd.shiftStartDate.Date).Where(a=>a.Count()>1.ToList();
if(groupUserSameDates.Count()>1)
{
foreach(groupUserSameDates中的var dategroup)
{
///3.返回在同一日期分配用户的所有班次
foreach(日期组中的ShiftDate ShiftDate)
{
重复日期。添加(移位日期);
}
}
}
}
返回重复的日期。ToList();
}

通过使用多个组,最终实现了此功能,请参见下面的工作代码:

 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();
    }
public IList GetDuplicateShiftsByOrg(int orgID)
{
IList AllDates=\u UoW.ShiftDates
.Get(s=>s.Shift.organizationId==orgID)
.Where(s=>s.assignedUserID!=null)
.ToList();
var DuplicateDates=新列表{};
///1.将分配给用户的所有班次分组
var groupUserShifts=AllDates.GroupBy(s=>s.assignedocomid.Value)。其中(g=>g.Skip(1.Any());
foreach(GroupUserShift中的var组)
{
///2.对同一日期分配给用户的所有班次进行分组
var groupUserSameDates=group.GroupBy(sd=>sd.shiftStartDate.Date).Where(a=>a.Count()>1.ToList();
if(groupUserSameDates.Count()>1)
{
foreach(groupUserSameDates中的var dategroup)
{
///3.返回在同一日期分配用户的所有班次
foreach(日期组中的ShiftDate ShiftDate)
{
重复日期。添加(移位日期);
}
}
}
}
返回重复的日期。ToList();
}

SO上的问题应该有代码。请进行一些研究,并使用一些示例代码和特定问题重试该问题。:)为了让您开始,您可能需要搜索“linq find matching datetime”之类的内容来回答这个问题,我们没有关于模式的信息,也不知道现在有什么不适合您……只添加了一点点代码……我知道这几乎不值得,我的尝试完全没有结果!首先需要在
AssignedUserID
上使用
GroupBy
。现在,您为每个用户分配了一个组,至少分配了一个班次:键是ID,值是记录列表。接下来,您需要检查
值内的重复项。使用Shift
列表。@AndreiV谢谢,这帮了大忙,我马上就到了,用我的解决方案更新了我的问题,所以应该有代码。请进行一些研究,并使用一些示例代码和特定问题重试该问题。:)为了让您开始,您可能需要搜索“linq find matching datetime”之类的内容来回答这个问题,我们没有关于模式的信息,也不知道现在有什么不适合您……只添加了一点代码……我知道