这个linq查询有什么问题?

时间:2009-05-07 15:52:53

标签: c# .net asp.net linq

我确定这是非常愚蠢的事情,但我只是没有看到它......

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?

4 个答案:

答案 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还是类似的东西?