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'.
上面的错误出现是因为我试图从一组移位日期返回一个移位日期,我必须添加一个额外的循环来首先遍历组。参见下面的解决方案
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();
}