2013-03-21 101 views
1

我有下面的代码:获得一个结果从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]; 
} 

我可以看到,当我调试的结果确实有我的预期单个字符串项。然而,我不能通过任何我知道的方法来索引或迭代数据。

我在找什么是我可以访问的数据。

下面是调试器说:

名称: (新System.Linq.SystemCore_EnumerableDebugView(结果))项目[0]

值: 700.0

类型: object {double}

PPLoadedData是一个DataTable

在此先感谢。

+0

你是否想要从你的方法中返回结果? – jhewlett 2013-03-21 04:43:24

回答

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了解更多信息。

编辑:请务必阅读埃里克的答案,它解释了何时使用哪种方法获取单个结果。

+0

我没有得到FirstOrDefualt()的选项。然而,迭代集合确实如下所述工作。虽然如此,结果集应该只是一个值,我觉得循环超过1个元素是一个不好的解决方案。那么你有没有其他的信息/我如何能做到这一点的例子?再次感谢 编辑您的编辑。 DataTable不需要AsEnumerable吗? – 2013-03-21 04:50:18

+0

@SeanP你在你的代码文件中有'使用System.Linq;'语句吗? – 2013-03-21 04:52:35

+0

我没有。哇,多么疏忽。谢谢。我编码我的解决方案! – 2013-03-21 04:56:31

2

结果是集合类型。你需要遍历它Datatable.AsEnumerable。当结果是IEneumerable<T>型等,其LINQ返回集合,你需要的,如果你希望导致单个项目的查询来遍历这样

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

谢谢,这确实有效,但循环超过1个元素并不是很好的做法。你有什么可以建议的吗?谢谢你的评论。 – 2013-03-21 04:51:08

+0

您不必迭代IList ,因为它定义了一个索引器。我也不知道任何返回IList的LINQ函数 ... – 2013-03-21 04:51:36

12

澄清杰森的回答是:

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

如果您使用适当的方法,那么当您的不变量被违反时会得到一个异常,这将帮助您调试程序。