我有一個DataTable
,名爲dt
,它有兩列,並且通過從CSV文件讀取數據進行填充。這兩列是Keys
和它們各自的Descriptions
大約7000行。將數據表與IList進行比較
現在我有IList<string>
鍵,它只是鍵(與DataTable
中的鍵相同)。
如何將IList<string>
鍵與DataTable
匹配,並檢索最終輸出爲new DataTable
,該輸出只有與IList
匹配的行?
我有一個DataTable
,名爲dt
,它有兩列,並且通過從CSV文件讀取數據進行填充。這兩列是Keys
和它們各自的Descriptions
大約7000行。將數據表與IList進行比較
現在我有IList<string>
鍵,它只是鍵(與DataTable
中的鍵相同)。
如何將IList<string>
鍵與DataTable
匹配,並檢索最終輸出爲new DataTable
,該輸出只有與IList
匹配的行?
您可以使用:
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();
在實體框架的情況下:
類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的真的糟糕表現
感謝哈比卜它的偉大工程 – user2779848