2014-02-13 31 views
0

我需要一個ID列表。所以我有一個非常簡單的SQL語句有沒有一種方便的方法將數據從單個列中轉換爲使用ADO .NET的集合?

SELECT FK_NormalizedKeyword FROM KeywordSpelling WHERE拼寫= @keywordspelling

它返回多行,但每行一個值。

我知道如何使用讀取器或數據適配器來獲取ADO .NET中的數據。但在這種簡單的情況下,這似乎是一種矯枉過正的行爲。我知道,如果我想要一個號碼,我可以使用cmd.ExecuteScalar(),並在沒有完整閱讀器的情況下獲得該值。有沒有什麼能讓我使用類似簡潔的代碼從數據庫中的單個列中獲取結果到空集合中?

+1

你可以讓你的查詢返回一個以逗號分隔的ID列表,然後使用ExecuteScalar - 但* *會是一種矯枉過正。使用'DataReader'是對資源負載最小的最快方式 –

+0

DataReader不是很沉重以避免它。 – Tarec

+0

沒有像內建的東西,但如果它是一個常見的足夠的場景,那麼你可以很容易地爲它做一個擴展方法。像'cmd。ExecuteList ()'期望單列,將結果轉換爲'T',並返回一個'IEnumerable '。 – David

回答

0

簡答。沒有

長答覆。您可以在響應中將您的值集中到單個字段中,但仍需要返回結果集。

1

Dapper

string keywordspelling = ...; 
var list = conn.Query<string>(
    @"SELECT FK_NormalizedKeyword 
     FROM KeywordSpelling WHERE Spelling = @keywordspelling", 
    new { keywordspelling }).ToList(); 

(請注意,我認爲FK_NormalizedKeyword是帶狀的場;如果它是一個整數,取代<string><int>

這也將複雜的數據進行工作例如:填充POCO,例如:

var orders = conn.Query<Order>(
    "SELECT * FROM Order WHERE [email protected]", 
    new { region }).ToList(); 

(這裏它會假設一個直接的列名/成員名地圖)

0

不要在一個聲明,但一個簡單的循環是:

while(dr.Read()) 
    list.Add(dr.GetInt32(0)); 
0

你必須使用一個DataReader檢索數據後,對方的一個記錄。然後您可以使用循環來填充集合。這是最有效的方法,因爲它滿足需求。但是,你可以隱藏這個循環有DataAdapter填補DataTable

DataTable tblKeyWords = new DataTable(); 
using(var con = new SqlConnection("...")) 
using(var da = new SqlDataAdapter("SELECT FK_NormalizedKeyword FROM KeywordSpelling WHERE Spelling = @keywordspelling", con)) 
{ 
    da.SelectCommand.Parameters.AddWithValue("@keywordspelling", "..."); 
    da.Fill(tblKeyWords); 
} 

DataAdapters and DataReaders

結果返回的查詢執行,並存儲在 網絡緩存在客戶端上,直到你使用DataReader的Read 方法請求它們。使用DataReader可以提高 應用程序的性能,只要它是可用的 即可檢索數據,並且(默認情況下)一次只在內存中存儲一​​行,從而減少系統開銷。

相關問題