2014-07-15 183 views
0

我有一個DataTable,名爲dt,它有兩列,並且通過從CSV文件讀取數據進行填充。這兩列是Keys和它們各自的Descriptions大約7000行。將數據表與IList進行比較

現在我有IList<string>鍵,它只是鍵(與DataTable中的鍵相同)。

如何將IList<string>鍵與DataTable匹配,並檢索最終輸出爲new DataTable,該輸出只有與IList匹配的行?

回答

1

您可以使用:

DataTable filtered = dt.AsEnumerable() 
         .Where(r => list.Contains(r.Field<int>("id"))) 
         .CopyToDataTable(); 

您還可以創建一個HashSet<T>和使用,在您的查詢。

List<int> list = new List<int>(); 
//.... ids in the list 

HashSet<int> hashSet = new HashSet<int>(list); 
DataTable filtered = dt.AsEnumerable() 
         .Where(r => hashSet.Contains(r.Field<int>("id"))) 
         .CopyToDataTable(); 
+1

感謝哈比卜它的偉大工程 – user2779848

0

在實體框架的情況下:

類DbItem { 公衆詮釋鍵{獲得;組; } public int Value {get;組; }}

var keysInMemory = new List<int>(); // put your Keys here 
var values = new StringBuilder(); 
values.AppendFormat("{0}", keysInMemory[0]); 
for (var i = 1; i < keysInMemory.Count; i++) 
      values.AppendFormat(", {0}", keysInMemory[i]); 

var sql = string.Format(@"SELECT dt.Key Key, dt.Value Value FROM [dbo].[dt] where Key IN ({0})", values.ToString()); 

var result = await _dbContext.Database.SqlQuery<DbItem>(sql).ToListAsync(); 

注意, 「包含」 與IQueryable的真的糟糕表現