.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
相关产品推荐
相关产品推荐

