C# 返回列表<;字符串>;from Linq查询返回查询语法而不是值

C# 返回列表<;字符串>;from Linq查询返回查询语法而不是值,c#,linq,C#,Linq,我有下面的代码来返回字符串列表 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 Db

我有下面的代码来返回字符串列表

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;
}
public List top5codefortoday()
{
var date=DateTime.Now;
var resultList=新列表();
使用(var db=new PillowContext())
{
var qry=(从d开始,以db.停机时间为单位
其中DbFunctions.TruncateTime(d.DateTime)==DbFunctions.TruncateTime(date)
按新{d.Code}分组d
进入g
设总数=g.Sum(x=>x.Amount)
按总降序排序
设top5=g.Take(5).ToList()
选择new{g.Key.Code,Total=Total});
foreach(qry中的var项目)
{
INTX=项目代码;
var结果=来自r,单位为db.DownTimeCodes
其中r.Code==x
选择r.描述;
添加(results.ToString());
}
}
返回结果列表;
}

当我查看returnList的内容时,我看到了正确的项目数,但是每个项目都是由实际的查询语法组成的,而不是数据本身。我以前见过这个问题,通常通过执行.ToList()来解决,但是我不确定如何更改代码来解决这个问题。这里的问题是,当您调用
ToString
时,查询尚未执行,因此本质上您是在
IQueryable
对象上调用
ToString
,接收查询而不是结果。您需要调用一些东西来执行查询

您仍然可以调用
ToList()

var results = (from r in db.DownTimeCodes
              where r.Code == x
              select r.Description).ToList();
resultList.AddRange(results);
或者,如果只需要一个结果,请调用
FirstOrDefault()
/
SingleOrDefault()


您正在调用
List
上的
ToString()
。作为大多数复杂类型的默认值,它只写出类型名,而不是数据

这条线

resultList.Add(results.ToString());
应改为

resultList.AddRange(results);

+1 OP的代码中没有空检查,所以我打赌在这种情况下调用
.First()
会更好。@Christofferette,根本不确定这是否是一个选项,只是为了完整性添加了它。变量名
results
提示OP需要的不是一个而是多个RecordsRect,@Andrei。我只是在猜测,我的猜测是基于这样一个事实:OP正在调用
.ToString()
,调用的是
结果。如果
results
是一个列表,
.ToString()
通常没有多大用处。谢谢Andrei,就这么简单。我现在有另一个问题,因为在迭代另一个查询的结果时运行另一个查询,但这与原始问题无关。一旦我解决了这个问题,我会把答案标记为正确答案tested@Jimsan,当然只是猜测,但在
foreach
之前调用另一个
ToList
for
qry
似乎可以解决另一个问题。我不确定这是否真的能解决OP摆脱“查询语法”的问题在结果中。我猜他/她想知道的是如何具体化查询。OP解释说,他得到了正确的行数,但它只包含类型名。因此,问题在于填写
resultList
。在提供的示例中,两个查询都将具体化—首先是通过
foreach
,其次是通过向
resultList
添加项。。。现在我知道你做了什么!起初我也没有注意到切换到
AddRange
resultList.AddRange(results);