2011-01-12 32 views
2

我試圖使用LINQ行從列值遍歷在一個DataTable,並實例化對象。下面顯示了棘手的代碼。「無法解析符號選擇」嘗試使用LINQ與DataRowCollection

的問題是,代碼將無法編譯。惡意錯誤消息是「無法解析符號選擇」。我很滿意DataRowCollection實現IEnumerable(它從System.Data.InternalDataCollectionBase中獲取它),所以你會認爲下面沒有問題(顯然,我錯了那個計數)。

我已經包含System.Linq的System.Data和System.Data.SqlClient在我的項目。它也有所有必要的參考。我之前一直在使用LINQ(主要是使用POCO和XDocuemnts列表),這是我第一次看到這個特定的消息。

如何解決它有什麼建議?

using (var command = connection.CreateCommand()) 
{ 
    command.CommandText = "dbo.sp_pTicklerContacts_sel_W_ContactRole_by_ComKey"; 
    command.CommandTimeout = 120; 
    command.CommandType = CommandType.StoredProcedure; 
    command.Parameters.Add("@iComKey", SqlDbType.Int).Value = companyKey; 

    using (var adapter = new SqlDataAdapter(command)) 
    { 
     var dataset = new DataSet(); 
     adapter.Fill(dataset); 
     if (dataset.TableCount() > 0 && dataset.Tables[0].Rows.Count > 0) 
     { 
      return (from row in dataset.Tables[0].Rows 
        select new TicklerContact 
           { 
            CompanyKey = row.ToInt32("iTicklerContact"), 
            Contact = row.ToString("ccontact"), 
            ContactKey = row.ToInt32("iconkey"), 
            TicklerContactKey = row.ToInt32("iTicklerContactKey"), 
            Role = row.ToString("contactrole"), 
            Exists = row.ToBool("contactexists") 
           }).ToList(); 

     } 
     return null; 
    } 
} 
+0

你得到一個線突出顯示錯誤消息? – 2011-01-12 18:45:28

回答

7

我不認爲你可以使用LINQ通過DataSet行,因爲它不實現IEnumerable<T>。如果你System.Data.DataSetExtensions添加到您的項目的引用,你雖然可以使用擴展方法,它允許你:

return (from row in dataset.Tables[0].AsEnumerable() 
... 

也可參閱所以這之前的答案:LINQ query on a DataTable

從MSDN文章DataTableExtensions.AsEnumerable

語言集成查詢(LINQ) 查詢關於數據源的工作, 實現IEnumerable接口 或IQueryable的INTERF高手。 DataTable類不會實現 的任一接口,所以您必須調用 AsEnumerable方法將 DataTable用作LINQ查詢的從 子句中的源。您也可以 獲得定製的,特定領域的 運營商,如CopyToDataTable,通過 返回一個IEnumerable對象。

1

也許你需要幫助LINQ出這一個。它不能解決行的類型?

嘗試:

return (from row as DataRow in dataset.Tables[0].Rows 
       select new TicklerContact 
          { 
           CompanyKey = row.ToInt32("iTicklerContact"), 
           Contact = row.ToString("ccontact"), 
           ContactKey = row.ToInt32("iconkey"), 
           TicklerContactKey = row.ToInt32("iTicklerContactKey"), 
           Role = row.ToString("contactrole"), 
           Exists = row.ToBool("contactexists") 
          }).ToList(); 

編輯

愚蠢的VB/C#的大腦粉碎:P

嘗試:

return (from DataRow row in dataset.Tables[0].Rows 
       select new TicklerContact 
          { 
           CompanyKey = row.ToInt32("iTicklerContact"), 
           Contact = row.ToString("ccontact"), 
           ContactKey = row.ToInt32("iconkey"), 
           TicklerContactKey = row.ToInt32("iTicklerContactKey"), 
           Role = row.ToString("contactrole"), 
           Exists = row.ToBool("contactexists") 
          }).ToList(); 
+0

不,不行。但這是一個很有希望的建議! – 2011-01-12 18:43:02

+0

看到我的編輯,希望這是訣竅。 – 2011-01-12 18:56:09