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

.NET Framework 4.8(EF6)转.NET6(EFCore6)方法转换求助

.NET Framework 4.8(EF6)到.NET 6(EF Core6)动态查询方法迁移解决方案

问题场景

在将.NET Framework 4.8(EF6)应用迁移到.NET 6(EF Core6)时,原项目中一段依赖动态LINQ的方法无法正常运行,核心问题是EF Core中无法直接通过Type获取非泛型DbSet。原方法代码如下:

private async Task<string> someMethod(PropertyInfo propModel, string ident, string text, string val) 
{
    Type nestedModel = propModel.PropertyType;
    DbSet nestedModelDbset = db.Set(nestedModel);

    PropertyInfo propIdent = nestedModel.GetProperty(ident);
    var nestedItem = await nestedModelDbset.Where(propIdent.Name + "== @0", val).Take(1).ToListAsync();
    var nestedInstance = nestedItem.First();
    PropertyInfo propToShow = nestedModel.GetProperty(text);
    string valToShow = (propToShow.GetValue(nestedInstance)).ToString();
    return valToShow;
}

注:代码中的.Where调用依赖System.Linq.Dynamic.Core包实现动态LINQ查询,该包已在新项目中安装,此部分无报错。

解决步骤

1. 确认依赖包

确保已安装NuGet包System.Linq.Dynamic.Core。

2. 添加DbContext扩展方法

由于EF Core的DbContext.Set()仅提供泛型版本,需通过反射实现非泛型的Set获取方法:

public static IQueryable Set(this DbContext context, Type T)
{
    var method = typeof(DbContext)
                     .GetMethods()
                     .Single(p => p.Name == nameof(DbContext.Set) && p.ContainsGenericParameters && !p.GetParameters().Any());
                       
    // 构造指定实体类型的泛型Set方法
    method = method.MakeGenericMethod(T);

    return method.Invoke(context, null) as IQueryable;
}

3. 修改原方法代码

将原方法中的DbSet替换为IQueryable,调用扩展方法获取查询对象:

private async Task<string> someMethod(PropertyInfo propModel, string ident, string text, string val) 
{
    Type nestedModel = propModel.PropertyType;
    // 替换原DbSet获取逻辑
    IQueryable nestedModelDbset = db.Set(nestedModel);

    PropertyInfo propIdent = nestedModel.GetProperty(ident);
    var nestedItem = await nestedModelDbset.Where(propIdent.Name + "== @0", val).Take(1).ToListAsync();
    var nestedInstance = nestedItem.First();

    PropertyInfo propToShow = nestedModel.GetProperty(text);
    string valToShow = (propToShow.GetValue(nestedInstance)).ToString();

    return valToShow;
}

修改完成后,方法即可在.NET 6环境下正常运行。

内容的提问来源于stack exchange,提问作者patsy2k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:35:13