代码之家  ›  专栏  ›  技术社区  ›  Kon

这个LINQ查询有什么问题?

  •  0
  • Kon  · 技术社区  · 16 年前

    我肯定这是件很愚蠢的事,但我就是看不见。

    pData.LocationHours 属于类型 BaseLocationHoursDataSet.LocationHoursDataTable . 但是当我把光标悬停在 l 我只看到了” (range variable) TSource l “-为什么?为什么Linq不知道它在处理什么?我用一个不同的数据表尝试相同的事情,所有的工作都很好……不是这个人。有什么问题?

    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 “线?

    4 回复  |  直到 16 年前
        1
  •  5
  •   CodeLikeBeaker    16 年前

    我想你可能需要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
  •  12
  •   Johannes Schaub - litb    16 年前

    我看到“源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和treult是什么?”

    我不知道你的问题是什么,但很可能是这个阶段的问题。由于某种原因,类型推理引擎无法确定源是什么。

    现在你将鼠标悬停在“L”上。发生什么事了?IntelliSense引擎询问语义分析器“L”的类型。语义分析器报告,已知“l”是接受tsource并返回tresult的函数中的参数,但方法类型推断器无法确定实际类型tsource对应的类型。

    因此,intellisense引擎尽其所能地使用它所得到的,并告诉您,l是tsource类型。IntelliSense引擎还注意到“L”是查询的范围变量,并告诉您这一事实。

    为什么? 它不知道我在“发件人”中是什么吗? l在pdata.locationhours“行?

    我不知道,但很清楚 某物 在您的代码中被破坏。如果不知道所有表达式的类型以及可用的扩展方法,我就很难说出到底发生了什么可怕的错误。

    当代码被破坏并且无法编译时,IntelliSense仍然尽其所能。我同意在这种情况下,结果有点令人困惑,但至少您知道,在出现问题之前,它已经达到了类型推理的程度。

        3
  •  0
  •   Phil Bennett    16 年前

    “l”不代表locationHours表中的数据行吗?我认为您需要在lambda中指定“l”的属性。

        4
  •  0
  •   Tom Clarkson    16 年前

    它应该是value=l.value还是类似的?