Jimsan
Jimsan

Reputation: 305

Returning List<string> from Linq query returns query syntax not values

I have the below code to return a list of strings.

public List<string> Top5CodesForToday()
{
    var date = DateTime.Now;
    var resultList = new List<string>();

    using (var db = new PillowContext())
    {
        var qry = (from d in db.DownTimes
            where DbFunctions.TruncateTime(d.DateTime) == DbFunctions.TruncateTime(date)
            group d by new {d.Code}
            into g
            let total = g.Sum(x => x.Amount)
            orderby total descending
            let top5 = g.Take(5).ToList()
            select new {g.Key.Code, Total = total});

        foreach (var item in qry)
        {
            int x = item.Code;
            var results = from r in db.DownTimeCodes
                          where r.Code == x
                          select r.Description;
            resultList.Add(results.ToString());
        }
    }
    return resultList;
}

When I look at the contents of returnList I am seeing the correct number of items however each item is made up of the actual query syntax, not the data itself. I have seen this before and usually solve it by doing .ToList() however I am unsure how I could change my code to solve this

Upvotes: 2

Views: 2639

Answers (2)

Kaspars Ozols
Kaspars Ozols

Reputation: 7017

You are calling ToString() on List<>. As default for most complex types, it just writes out type name not the data.

This line

resultList.Add(results.ToString());

should be changed to

resultList.AddRange(results);

Upvotes: 1

Andrei
Andrei

Reputation: 56698

The problem here is that when you are calling ToString the query is not executed yet, so essentially you are calling ToString on a IQueryable object, receiving the query instead of results. You need to call something to execute the query.

You can call ToList() still:

var results = (from r in db.DownTimeCodes
              where r.Code == x
              select r.Description).ToList();
resultList.AddRange(results);

Or, if you expect just one result, call FirstOrDefault()/SingleOrDefault():

var results = (from r in db.DownTimeCodes
              where r.Code == x
              select r.Description).FirstOrDefault();
resultList.Add(results);

Upvotes: 7

Related Questions