user2871847
user2871847

Reputation:

Linq Method Error IOrderedQueryable

I have a database with a specific id with recorded Time's, I need help on trying to figure out time gap's between an ID's time's e.g 13:05:15 and 13:05:45 though if the time gap is over 10/15 seconds it needs to be recorded so it can be used in say a text file/other data etc. I previously asked a similar question on here, here is what my code looks like so far:

This class is used to manipulate data through the linq var being queried/looped

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

This is the foor loop within a separate class which was my original idea

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;
    }

Which I got the error:

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

I changed the for loop to use an object of the manipulation class

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;
}

Though now I get the error: Cannot convert type 'Project.Status' to 'Project.Result'

Does anyone possibly have a solution to get around this I have looked through a few resources but haven't been able to find anything of helps also even on Microsoft's Linq Forum. Any help is much appreciated ! :)

Upvotes: 1

Views: 1345

Answers (2)

Jos Bosmans
Jos Bosmans

Reputation: 161

Your linq query (in the second try) will return an IEnumerable of whatever is the element type of data.AssetStatusHistories. I assume this is some kind of IEnumerable<Project.Status>, so you're in fact trying to assign Project.Status objects to an iterator variable (subResult) of type Result, which is why you're getting the error Cannot convert type 'Project.Status' to 'Project.Result'.

So your problem is not really in the linq query, you just need a way to convert your Project.Status objects to Project.Result objects.

Upvotes: 0

Grant Winney
Grant Winney

Reputation: 66469

Try adding .ToList() to the end of your LINQ statement, after OrderBy:

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))
{
    ...
}

Also, I think you could modify your LINQ to do a GroupBy of the ID column, but that's something you could do research on if you wish. (Tutorial)

Upvotes: 1

Related Questions