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
forqry
似乎可以解决另一个问题。我不确定这是否真的能解决OP摆脱“查询语法”的问题在结果中。我猜他/她想知道的是如何具体化查询。OP解释说,他得到了正确的行数,但它只包含类型名。因此,问题在于填写resultList
。在提供的示例中,两个查询都将具体化—首先是通过foreach
,其次是通过向resultList
添加项。。。现在我知道你做了什么!起初我也没有注意到切换到AddRange
。
resultList.AddRange(results);