我有一个包含以下字段的 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 语句来执行上述操作?