1

我有一个包含以下字段的 MS SQL 表。我正在使用实体框架:

EntryId
EntryType
Operation
UpdatedTime_UTC

EntryId 和 EntryType 字段可以包含重复值。当一个对象被创建时,一条记录被添加并且它的“操作”字段将被设置为“添加”。如果对象被修改,则写入另一条记录,其 EntryId 和 EntryType 值与第一条记录相同,但“操作”字段将设置为“已修改”。当对象被删除时(您已经猜到了),另一条记录将写入与之前记录相同的 EntryId 和 EntryType 值,但“操作”字段将设置为“已删除”。

一些示例数据如下所示:

ID1, Type1, “added”,    2012-08-20 09:15:50
ID2, Type1, “added”,    2012-08-21 09:15:50
ID1, Type1, “modified”, 2012-08-22 09:15:50
ID1, Type1, “modified”, 2012-08-23 09:15:50
ID2, Type1, “deleted”,  2012-08-24 09:15:50

这显示了有关两个对象(ID1 和 ID2)的信息。两者都已添加到表中,但 ID1 已修改且 ID2 已删除。作为协调过程的一部分,我需要检查一个对象是否已被删除,在我的表中必须有一条记录,其匹配的 EntryId 的操作设置为“已删除”。如果没有我的代码将添加一个。

现在到我的问题。当我的系统认为给定的“EntryType”没有对象时,我会调用一个函数。我需要确认我的表中该“EntryType”的所有记录都有一条“操作”设置为“已删除”的记录。在上面显示的数据中,“ID1”没有“已删除”条目。如果对象仍然存在,这很好,但如果对象已经消失,则不好。我正在使用下面的 Linq 来获取一个分组列表,我在其中传递了我感兴趣的“entityType”。

        var item = _ctx.JournalSet
            .Where(x => x.EntryType == entityType)
            .OrderBy(x => x.UpdatedTime_UTC)
            .GroupBy(x => x.EntryId);

然后,我使用此代码查看每个组,看看它有一个“已删除”条目。如果没有,我会在我的表中添加一条新记录。

        foreach (var item in result)
        {
            if (item.Last().Operation != "deleted")
            {
                // no 'deleted' entry found. time to add a new entry.
            }
        }

我想做的是修改我的 Linq 语句,以便它只在需要添加已删除条目时返回 EntryId 和 EntryType 详细信息。

附加信息:已删除记录的日期时间总是晚于“添加”或“修改”记录,因此当按“UpdatedTime_UTC”排序时,如果给定 entryId 存在最后一个条目,则该条目应为“已删除”

是否可以在不需要 foreach 的情况下创建一个 Linq 语句来执行上述操作?

4

2 回答 2

2

你有没有尝试过这样的事情?

    var item = _ctx.JournalSet
         .Where(x => x.EntryType == entityType)
         .OrderBy(x => x.UpdatedTime_UTC)
         .GroupBy(x => x.EntryId)
         .Where(y => y.Last().Operation != "deleted"); 
于 2012-09-20T15:22:44.677 回答
0

我会找到您缺少已删除条目的记录,然后根据需要添加它们:

 var itemsToAdd = _ctx.JournalSet
        .Where(x => x.EntryType == entityType)
        .OrderBy(x => x.UpdatedTime_UTC)
        .GroupBy(x => x.EntryId)
        .Where(grp => grp.Last().Operation != "deleted");

然后,您可以使用 aforeach添加项目,甚至可以通过第二个 LINQSelect语句(映射到新类型)来执行此操作,具体取决于您添加的集合。第二个语句可能类似于:

 collection.AddRange(itemsToAdd.Select(grp => new YourType(grp.Key.EntryId, "deleted")));

(这是假设构造函数采用 ID +“已删除”,根据需要进行编辑...)

于 2012-09-20T15:24:11.140 回答