【问题标题】:LINQ to Entity Query - duplicates in a groupLINQ to Entity Query - 组中的重复项
【发布时间】: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


【解决方案1】:

试试这个:

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

【讨论】:

  • 这根本没有帮助
  • 好吧,更新前我只能制作这些了,没有给出足够的细节
【解决方案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> { };

        /// 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();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2010-11-06
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多