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”之类的内容来回答这个问题,我们没有关于模式的信息,也不知道现在有什么不适合您……只添加了一点代码……我知道