仅在日期之间返回项目,并且仅在删除其他项目之前创建

时间:2014-02-19 18:48:49

标签: c# linq logical-operators

假设我有一个包含已创建和已删除日期时间的项目列表:

  ITEM,   CREATED, DELETED
item 1, 1/1/1999, 1/14/2014
item 2, 1/1/1999, 1/17/2014
item 3, 1/15/2014, NULL
item 4, 1/16/2014, NULL

我需要一份包含最终结果的清单,所以

项目3取消了项目1,因为它是在项目1被删除后创建的,但项目4不会取消项目2,因为它是在项目2被删除之前创建的。

所以最终结果应该是一个带

的列表

第2项,第3项,第4项

我现在的代码如下

                int year = DateTime.Now.Year;
                DateTime sdate = new DateTime(year, DateTime.Now.Month - 1, 1);
                DateTime edate = new DateTime(year, DateTime.Now.Month, 1);

                var qry = Emails.collection.Where(t => 
                    t.deletedon.HasValue ?
                    t.deletedon.Value >= sdate :
                    t.createdon.Value < edate
                    ).ToArray()

但此代码包括第1项。 因此,除非在开始日期之后删除,否则它包括在结束日期之前创建的所有未删除的项目。

但是如果一个项目被删除并且创建了一个新项目,那么该列表包括两者。但我需要基本上用已创建的一个替换已删除的一个,因此最终结果计数总计一次创建和激活的最大电子邮件数。

Emails.Item[] created = Emails.collection.Where(t => t.createdon.Value >= sdate && t.createdon.Value < edate).ToArray();
Emails.Item[] deleted = Emails.collection.Where(t => t.deletedon.HasValue && (t.deletedon.Value >= sdate && t.deletedon.Value < edate)).ToArray();

Emails.Item[] exceptions = deleted.Where(t => created.FirstOrDefault(c => c.createdon.Value >= t.createdon.Value)).ToArray(); ???

2 个答案:

答案 0 :(得分:0)

您的查询存在的问题是,如您所述,项目的取消取决于与其他项目的比较,而您的位置仅检查每个项目本身的条件。

假设我理解你的问题:

  • 您需要一份包含所有未删除项目以及已删除但尚未取消的项目的列表。
  • 如果在删除项目后创建了另一个项目,则该项目被视为已取消

如果是这种情况,我会首先检索未删除的项目,然后分别检索已删除的项目。下一步是使用未删除项目的创建日期过滤已删除的项目。

这样做的一种简单方法是按创建日期对未删除的项目进行排序并获取最早的项目并使用它来删除所有删除项目,删除日期早于此。

最后一步:合并两个列表。

答案 1 :(得分:0)

这是一个丑陋但有效的版本..

                int year = DateTime.Now.Year;
                DateTime sdate = new DateTime(year, DateTime.Now.Month - 1, 1);
                DateTime edate = new DateTime(year, DateTime.Now.Month, 1);

               Emails.Item[] created = Emails.collection.Where(t => t.createdon.HasValue && (t.createdon.Value >= sdate && t.createdon.Value < edate)).OrderByDescending(y => y.createdon).ToArray();
                List<Emails.Item> deleted = Emails.collection.Where(t => t.deletedon.HasValue && (t.deletedon.Value >= sdate && t.deletedon.Value < edate)).OrderByDescending(y => y.deletedon).ToList();
                List<Emails.Item> ex = new List<Emails.Item>();
                foreach (Emails.Item t in created)
                {
                    Emails.Item d = deleted.FirstOrDefault(y => y.deletedon.Value >= t.createdon.Value);
                    if (d != null && t.createdon.Value <= d.deletedon.Value)
                    {
                        deleted.Remove(d);
                        ex.Add(t);
                    }
                }

                //System.Windows.MessageBox.Show(created.Count().ToString() + " / " + deleted.Count().ToString() + " / " + ex.Count().ToString());

                var qry = Emails.collection.Where(t => 
                    t.deletedon.HasValue ?
                    t.deletedon.Value >= sdate :
                    t.createdon.Value < edate
                    ).Except(ex).ToArray()
                    .OrderBy(t => t.lastname).OrderBy(t => t.firstname).GroupBy(x => x.company, (key, group) => new { Company = key, Items = group });

任何人都知道如何压缩这一切吗?