从LINQ语句中获取单个结果

时间:2013-03-21 04:39:51

标签: c# .net linq

我有以下代码:

private void SelectRowData(int wire, int bond, string svid)
{
    var results = from myRow in PPLoadedData.AsEnumerable()
                  where 
                      myRow.Field<Int32>("Wires.OperationOrder") == wire &&
                      myRow.Field<Int32>("Bonds.OperationOrder") == bond
                  select myRow[svid];
}

我可以看到,当我调试时,结果确实有我期望的单个字符串项。但是,我无法通过我所知的任何方式索引或迭代数据。

我正在寻找的是我可以访问数据的东西。

以下是调试器所说的内容:

  

名称:   (new System.Linq.SystemCore_EnumerableDebugView(results))。Items [0]

     

值:   700.0

     

类型:   对象{double}

PPLoadedDataDataTable

提前致谢。

3 个答案:

答案 0 :(得分:13)

澄清杰森的回答:

  • 如果该集合可以包含任意数量的项目,请使用FirstOrDefault()
  • 如果该集合始终包含一个或多个项目,请使用First()
  • 如果该集合始终包含零个或一个项目,请使用SingleOrDefault()
  • 如果该集合始终有一个项目,请使用Single()

如果使用适当的方法,则在违反不变量时会出现异常,这将有助于您调试程序。

答案 1 :(得分:7)

如果您希望查询产生单个项目,则应使用SingleOrDefault方法,如下所示:

var result = (from myRow in PPLoadedData.AsEnumerable()
               where myRow.Field<Int32>("Wires.OperationOrder") == wire && 
                     myRow.Field<Int32>("Bonds.OperationOrder") == bond
               select myRow[svid]).SingleOrDefault();
if(result != null)
    // Do stuff with result

通常,Linq查询返回IEnumerables,您必须迭代它,而不是通过索引访问。但是,在您只需要单个值的情况下,有几种方法可以获得所需的值。有关详细信息,请查看MSDN上的System.Linq.Enumerable

编辑:请务必阅读Eric的答案,该答案解释了何时使用哪种方法获得个人结果。

答案 2 :(得分:2)

结果是收集类型。你需要迭代它Datatable.AsEnumerable。当结果是IEneumerable<T>的类型以及LINQ在集合中返回的其他类型时,您需要像这样迭代

foreach (var item in results)
{
  //do some thing with item 
}