如何将ListItemCollection中的两个字段加载到DataTable中
核心思路很直接:先创建包含目标字段的DataTable,再遍历已获取的ListItemCollection,把每个条目的指定字段值填入DataTable即可。另外建议优化数据加载逻辑,只加载需要的两个字段,避免冗余数据、提升效率。
完整修改后的代码
static void Main(string[] args) { string siteUrl = ConfigurationManager.AppSettings["SiteUrl"]; string clientID = ConfigurationManager.AppSettings["ClientId"]; string clientSecret = ConfigurationManager.AppSettings["ClientSecret"]; // 1. 初始化目标DataTable,添加需要的两列 DataTable dt = new DataTable(); dt.Columns.Add("CompanyID", typeof(string)); // 类型根据SharePoint列表字段实际类型调整 dt.Columns.Add("Reference", typeof(string)); // 类型根据SharePoint列表字段实际类型调整 using (ClientContext cc = new AuthenticationManager().GetACSAppOnlyContext(siteUrl, clientID, clientSecret)) { Web site = cc.Web; List targetList = site.Lists.GetByTitle("Companies"); CamlQuery query = new CamlQuery(); query.ViewXml = "<View><Query><Where><Contains><FieldRef Name='CompanyID'/></Contains></Where></Query></View>"; ListItemCollection collListItem = targetList.GetItems(query); // 2. 只加载需要的两个字段,减少数据传输量 cc.Load(collListItem, items => items.Include( item => item["CompanyID"], item => item["Reference"] )); cc.ExecuteQuery(); if (collListItem.Count == 0) { Console.WriteLine("未找到任何条目。"); } else { // 3. 遍历ListItem,将指定字段值添加到DataTable foreach (ListItem targetListItem in collListItem) { DataRow row = dt.NewRow(); // 字段名称必须和SharePoint列表的内部名称完全一致 row["CompanyID"] = targetListItem["CompanyID"] ?? DBNull.Value; row["Reference"] = targetListItem["Reference"] ?? DBNull.Value; dt.Rows.Add(row); } // 验证导入结果 Console.WriteLine($"共导入{dt.Rows.Count}条数据\n"); foreach (DataRow row in dt.Rows) { Console.WriteLine($"CompanyID: {row["CompanyID"]}, Reference: {row["Reference"]}"); } Console.ReadLine(); } } }
关键注意点
- 列类型匹配:DataTable的列类型要和SharePoint列表字段的实际类型对应,比如CompanyID是数字类型就改成
typeof(int)。 - 字段名称准确性:必须使用SharePoint列表字段的内部名称,不是显示名称,否则会出现字段找不到的问题。
- 空值处理:用
?? DBNull.Value处理字段为空的情况,避免DataTable插入空值时报错。 - 加载优化:通过
Include指定要加载的字段,比默认加载所有字段更高效,尤其适合字段较多的列表。
内容的提问来源于stack exchange,提问作者CGarden
相关产品推荐
相关产品推荐

