我确定这是非常愚蠢的事情,但我只是没有看到它......
pData.LocationHours
的类型为BaseLocationHoursDataSet.LocationHoursDataTable
。然而,当我将光标悬停在l
上时,我看到的只是“(range variable) TSource l
” - 为什么会这样? linq为什么不知道它正在处理什么?我用不同的DataTable尝试相同的东西,一切正常....不是这个人。可能是什么问题?
protected ListItem[] GetHoursTypesListItems(BaseLocationHoursDataSet pData)
{
return (
from l in pData.LocationHours // putting cursor over the l here shows: (range variable) TSource l
select new ListItem
{
Value = l, //ignore the fact that I didn't specify a property - that's the problem, that none of the properties of the object show up.
Text = l
}
).ToArray<ListItem>();
}
更新
问题在于它不知道我是什么。而不是向我显示正确的类型(我希望看到LocationHoursRow),我看到“TSource l”..这是什么?为什么它不知道“from l in pData.LocationHours
”行中的l?
答案 0 :(得分:12)
我看到“TSource l”..这是什么?
首先,编译器将查询从查询形式转换为方法调用形式。此查询变为
pData.LocationHours.Select(l=>new ... )
其次,编译器尝试确定“pData.LocationHours.Select”的含义。如果pData.LocationHours的类型没有Select方法,则编译器开始寻找扩展方法。据推测它找到了扩展方法
IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source, Func<TSource, TResult> projection)
或许它找到了同样的IQueryable版本。
现在编译器说“但是TSource和TResult的类型参数是什么?”
我不知道你的问题是什么,但问题很可能发生在这个阶段。由于某种原因,类型推理引擎无法确定TSource是什么。
现在你将鼠标悬停在“l”上。怎么了? intellisense引擎询问语义分析器“l”的类型。语义分析器报告已知“l”是函数中的参数,它接受TSource并返回TResult,但方法类型推导者无法确定TSource对应的实际类型。
因此智能感知引擎尽其所能,并且告诉你l是TSource类型。智能感知引擎还注意到“l”是查询的范围变量,并且也告诉你这个事实。
为什么 不知道我在“来自”中是什么 l在pData.LocationHours中“行?
我不知道,但很明显某些在您的代码中被破坏了。如果不知道所有表达式的类型以及确切的可用扩展方法,我很难说出究竟出现了什么错误。
当代码被破坏且无法编译时,智能感知仍然能够做到最好。我同意在这种情况下结果有点令人困惑,但至少你知道它在出现错误之前就会进行类型推断。
答案 1 :(得分:5)
我想也许你需要l.Field:
select new ListItem
{
Value = l.Field,
Text = l.Field2
}
好的,这样的事情: 由于您使用的是数据集,因此查询可能需要与以下内容类似:
var query = pData.Tables["Name"].AsEnumerable()
然后从查询对象中删除LINQ
此外,发现此代码段可能会有所帮助。它使用通用数据集作为参考。
DataSet ds = new DataSet();
FillOrders(ds);
DataTable orders = ds.Tables["SalesOrderHeader"];
var ordersQuery = orders.ToQueryable();
var query = from o in ordersQuery
where o.Field<bool>("OnlineOrderFlag") == true
select new { SalesOrderID = o.Field<int>("SalesOrderID"),
OrderDate = o.Field<DateTime>("OrderDate") };
答案 2 :(得分:0)
在LocationHours表中不代表数据行?我认为你需要在lambda中指定'l'的属性。
答案 3 :(得分:0)
它应该是Value = l.Value还是类似的东西?