You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:48:03