使用Dynamic Linq从模型列表动态选指定字段生成List<long>集合
实现方案
方案1:基于Dynamic Linq实现(依赖第三方包)
- 第一步:安装NuGet包
System.Linq.Dynamic.Core - 第二步:直接调用Dynamic Linq的Select重载完成动态取值,代码示例:
using System.Linq.Dynamic.Core; // 业务逻辑 string sql = "Select * From ReportCategories Where ReportID = 1;"; string primaryKeyName = "ReportCategoryID"; var items = await _dbCloud.QueryAsync<T>(sql); // 动态取主键集合 var dynamicIds = items.Select(primaryKeyName).ToDynamicList(); List<long> primaryIds = dynamicIds.Select(x => (long)x).ToList();
方案2:基于原生表达式树实现(无第三方依赖,性能最优)
这种方案不需要依赖Dynamic Linq,性能接近原生硬编码写法,远高于反射实现,适合所有场景:
首先定义通用扩展方法:
using System.Linq.Expressions; public static class EntityExtension { public static List<long> GetPrimaryKeyValues<T>(this IEnumerable<T> entityList, string primaryKeyName) { var param = Expression.Parameter(typeof(T), "e"); var propertyAccess = Expression.Property(param, primaryKeyName); var selectLambda = Expression.Lambda<Func<T, long>>(propertyAccess, param).Compile(); return entityList.Select(selectLambda).ToList(); } }
业务层调用代码:
string sql = "Select * From ReportCategories Where ReportID = 1;"; string primaryKeyName = "ReportCategoryID"; var items = await _dbCloud.QueryAsync<T>(sql); List<long> primaryIds = items.GetPrimaryKeyValues(primaryKeyName);
方案优势:
- 无第三方包依赖,完全基于.NET原生API实现
- 性能远高于反射实现,高频调用场景下可以缓存编译后的Lambda表达式,性能和硬编码写法几乎一致
- 调用层代码简洁,仅需一行即可完成主键集合提取
内容的提问来源于stack exchange,提问作者DaveA
相关产品推荐
相关产品推荐

