【发布时间】:2017-12-10 19:15:50
【问题描述】:
我有下表,其中包含班次列表以及分配给每个班次的用户,如下所示:
ShiftID | StartDateTime | EndDateTime | AssignedUserID |
-------------------------------------------------------------
我要做的是提取在同一日期和时间分配给用户的所有班次的 shiftID。这不应该发生,因为一个人不能同时在两个地方......(这个已经排序......现在)
我们的数据库中有一些实例,其中同一用户被分配在同一日期和时间从事 2 个不同的轮班工作。
例如
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 中看到的那样,我想提取 group2 中的 shiftdates。但是,当我尝试这样做时,出现以下错误:
无法将“Grouping[System.DateTime,MySolution.POCO.ShiftDate]”类型的对象转换为“MySolution.POCO.ShiftDate”类型。
更新
出现上面的错误是因为我试图从一组轮班日期中返回一个轮班日期,我必须添加一个额外的循环来首先循环遍历这些组。请参阅下面的解决方案
【问题讨论】:
-
关于 SO 的问题应该有代码。请做一些研究并用一些示例代码和具体问题重试这个问题。 :) 为了让您开始,您可能想要搜索“linq find matching datetime”之类的内容。要回答这个问题,我们没有关于架构的信息,也不知道现在什么不适合您...
-
只添加了一点代码...我知道这不值得,我的尝试完全没有结果!
-
您首先需要在
AssignedUserID上使用GroupBy。您现在为每个分配到至少一个班次的用户分配一个组:键是 ID,值是记录列表。接下来,您需要使用list duplicates 检查value.Shifts列表中的重复项。 -
@AndreiV 谢谢,这帮助很大,我快到了,用我的解决方案更新了我的问题
标签: c# entity-framework linq