2011-03-10 22 views
0

当我说简单地说“select c”时,下面的代码有效,但我想选择id,名字和姓氏,而不是整行,因为它相当长。Linq-to-Dataset语法:如何从查询中正确选择特定字段并使用它们

我对Linq相当陌生。我曾与匿名类型的工作,但已被指示定义所有变量(因此所有的“IEnumeralbe(的DataRow)”的)..但我没有遇到的例子使用“选择”我想要的方式并且他们不倾向于使用查询中选择的字段继续使用for循环。

任何意见将不胜感激。

在此先感谢!


Dim cands As IEnumerable(Of DataRow) = ds.Tables("Candidates").AsEnumerable() 
    Dim candPlace As IEnumerable(Of DataRow) = ds.Tables("JobCandPlacement").AsEnumerable() 
    Dim candComp As IEnumerable(Of DataRow) = ds.Tables(dctSearchCriteria.Values(i).ToString).AsEnumerable() 
    Dim strCandID As String = "" 

    Dim candMatches As IEnumerable(Of DataRow) = From c In cands, cc In candComp, cp In candPlace 
       Where c.Field(Of String)("candidateID") = cc.Field(Of String)("candID") _ 
       AndAlso cc.Field(Of String)("compSkill") = cSkill _ 
       Select c("candidateID"), c("firstName"), c("lastName") 

    For Each cm As DataRow In candMatches 
     strCandID = "" 
     strCandID = cm("candidateID") 
     increaseCandScore(strCandID) 
     If Not dtSuitableCands.Rows.Contains(strCandID) Then 
      Dim dr As DataRow = dtSuitableCands.NewRow 
      dr("candID") = cm("candidateID") 
      dr("candFName") = cm("firstName") 
      dr("candLName") = cm("lastName") 
      AddNewRow(dr) 
     End If 
    Next 
+0

“Option Infer”没有任何问题。 – SLaks 2011-03-10 02:36:02

回答

0

是没有意义的。整个表已经在内存中,所以你所要做的就是加上的开销。
LINQ永远不会复制值,所以优化这个的唯一方法是完全摆脱列。

要回答这个问题,你需要选择一个anonymous type

Select New With { .ID = c("candidateID"), ... } 

您也可以使用当前的语法,这相当于这个。

由于您创建的是匿名类型,因此无法将其声明为IEnumerable(Of DataRow);您必须使用Option Infer并编写Dim candMatches = From ...

+0

我添加了选项Infer,谢谢,我没有意识到这一点。 – novice 2011-03-10 02:41:27

+0

谢谢堆!我想我需要对Linq做更多的研究,以便正确掌握它。 – novice 2011-03-10 02:43:54

相关问题