Linq方法错误IOrderedQueryable

时间:2014-01-01 13:50:51

标签: c# linq linq-to-entities

我有一个具有记录时间的特定id的数据库,我需要帮助才能找出ID时间之间的时间间隔,例如13:05:15和13:05:45但是如果时间间隔超过10 / 15秒它需要记录,所以它可以用于说文本文件/其他数据等。我先前在这里问过类似的问题,这是我的代码到目前为止的样子:

此类用于通过查询/循环的linq var来操作数据

public class Result
{
    public bool LongerThan10Seconds { get; set; }
    public int Id { get; set; }
    public DateTime CompletionTime { get; set; }
}

这是一个单独的类中的foor循环,这是我最初的想法

using (var data = new ProjectEntities())
{
    Result lastResult = null;
    List<Result> dataResults = new List<Result>();

    foreach(var subResult in data.Status.Select(x => x.ID).Distinct().Select(Id => data.Status.Where(x => x.ID == Id).OrderBy(x => x.Time)))
    {
        if (lastResult != null)
        {
            if (subResult.CompletionTime.Subtract(lastResult.CompletionTime).Seconds > 10)
                dataResults.Add(subResult);
        }
        lastResult = subResult;
    }

我收到了错误:

 Linq.IOrderedQueryAble does not contain a definition for 'CompletionTime' and no Extension method 'CompletionTime' accepting a first argument of type 'System.Linq.IOrderedQueryable.

我更改了for循环以使用操作类的对象

foreach(Result subResult in data.AssetStatusHistories.Select(x => x.ID).Distinct().SelectMany(Id => data.AssetStatusHistories.Where(x => x.ID == Id).OrderBy(x => x.TimeStamp)))
{
    if (lastResult != null)
    {
        if (subResult.CompletionTime.Subtract(lastResult.CompletionTime).Seconds > 10)
        {
            vehicleResults.Add(subResult);
        }                
    }

    lastResult = subResult;
}

虽然现在我收到错误:Cannot convert type 'Project.Status' to 'Project.Result'

有没有人可能有解决方案来解决这个问题我已经浏览了一些资源,但即使在微软的Linq论坛上也找不到任何帮助。任何帮助深表感谢 ! :)

2 个答案:

答案 0 :(得分:1)

尝试在.ToList()之后将OrderBy添加到LINQ语句的末尾:

var results = data.Status.Select(x => x.ID).Distinct()
                         .Select(Id => data.Status.Where(x => x.ID == Id)
                                                  .OrderBy(x => x.Time)
                                                  .ToList();

foreach(var subResult in results))
{
    ...
}

另外,我认为您可以修改LINQ来GroupByID,但如果您愿意,可以进行研究。 (Tutorial

答案 1 :(得分:0)

您的linq查询(在第二次尝试中)将返回IEnumerable,其中包含data.AssetStatusHistories的元素类型。我假设这是某种IEnumerable<Project.Status>,所以你实际上试图将Project.Status个对象分配给Result类型的迭代器变量(subResult),这就是为什么你&# 39;重新获得错误Cannot convert type 'Project.Status' to 'Project.Result'

所以你的问题实际上不在linq查询中,你只需要一种方法将Project.Status个对象转换为Project.Result个对象。