1

我有一个看起来像这样的表:
关键日期...姓名...状态...
(ID)五月...
(ID)五月...
(ID)五月...
(ID)六月...
( ID)六月...
(ID)六月...
(ID)七月...
(ID)七月...

我需要以粗体显示实体,因为这是集合的整体属性。所以它看起来像:

(ID) 五月 ...
(ID) 六月 ...
(ID) 七月 ...

实体集通过以下方式检索:

var status = from a in ObjectContext.InspectionReadings
                     where a.InspectionID == new Guid(inspID)
                     && a.DateTaken > before
                     && a.DateTaken <= DateTime.Now
                     orderby a.DateTaken descending, a.Status descending
                     select a;

现在我只需要过滤掉我不想要的。

我怎样才能做到这一点?

谢谢

4

3 回答 3

2

您需要使用该group by子句...

var status = from a in ObjectContext.InspectionReadings
             where a.InspectionID == new Guid(inspID)
             && a.DateTaken > before
             && a.DateTaken <= DateTime.Now
             group a by a.DateTaken.Month into g
             from m in g
             select new 
             {
               g.Key, g.OrderBy(x => x.DateTaken).First()
             };
于 2012-07-03T16:18:14.583 回答
2

您可以通过GroupBy调用来完成此操作First

例如,给定您的原始查询status,您可以执行以下操作:

var firstStatuses = 
    status.GroupBy(i => i.DateTaken).Select(g => g.First());

请注意,LINQ-to-Entities 可能无法根据基础数据库中 select 子句的要求正确分组数据。

有了它,您可以随时调用AsEnumerable以强制查询发生在内存中的对象上:

var firstStatuses = 
    status.AsEnumerable().GroupBy(i => i.DateTaken).Select(g => g.First());

需要注意的是,您可能应该根据要退回的物品订购每个组(如果它们尚未正确订购)。

于 2012-07-03T16:18:35.587 回答
2

您可以编写一个仅查看 DateTaken 字段的 IEqualityComparer,然后像这样使用 Distinct():

public class DateTakenComparer : IEqualityComparer<InspectionReading>
{
    public bool Equals(InspectionReading x, InspectionReading y)
    {
        return x.DateTaken == y.DateTaken;
    }

    public int GetHashCode(InspectionReading obj)
    {
        return obj.GetHashCode();
    }
}

接着:

var statuses = ObjectContext.InspectionReadings
    .Distinct(new DateTakenComparer())
    .OrderByDescending(x => x.DateTaken)
    .ToList();
于 2012-07-03T16:35:31.243 回答