我正在尝试将 .NET Framework 4.8 (EF6) 应用程序转换为 .NET Core 6 (EFCore 6)。
我有这个方法可以在.NET 4.8中运行:
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;
}
我已经尝试了几个小时将其转换为在 .NET Core 6 中工作,但我尝试的一切都失败了......
有什么帮助吗?
更新
好的,根据评论,我会尝试提供更多信息...
基本上这有两部分:第一个部分是获取正确的数据库集,第二个部分是查询它以获得所需的值。
第二部分:
.Where(propIdent.Name + "== @0", val)
好吧,我虽然这是标准的 LINQ,但它似乎来自使用 System.Linq.Dynamic.Core (Dai 评论让我深入研究它,所以谢谢) (检查https://www.nuget.org/packages/System.Linq.Dynamic.Core/) (抱歉,这是一个旧项目,我什至不知道它正在使用额外的块)
nuget 似乎也适用于 .NET Core,所以我已将其安装在新项目中,现在该部分代码没有显示错误...但在我拥有第一部分之前,我无法确定它是否会工作工作(获取数据库集)...
我相信此代码将对您有益:
private async Task<string> SomeMethodAsync(PropertyInfo propModel, string ident, string text, string val)
{
Type nestedModelType = propModel.PropertyType;
var nestedModelDbSet = db.Set(nestedModelType);
var paramExpr = Expression.Parameter(nestedModelType, "x");
var propIdentExpr = Expression.Property(paramExpr, ident);
var equalsExpr = Expression.Equal(propIdentExpr, Expression.Constant(val));
var lambdaExpr = Expression.Lambda(equalsExpr, paramExpr);
var whereMethod = typeof(EntityFrameworkQueryableExtensions).GetMethod(nameof(EntityFrameworkQueryableExtensions.Where), new[] { typeof(IQueryable<>), typeof(Expression<>) });
var whereGenericMethod = whereMethod.MakeGenericMethod(nestedModelType);
var whereQuery = (IQueryable<object>)whereGenericMethod.Invoke(null, new object[] { nestedModelDbSet, lambdaExpr });
var nestedItem = await ((IAsyncEnumerable<object>)whereQuery.AsAsyncEnumerable()).FirstOrDefaultAsync();
if (nestedItem != null)
{
var propToShow = nestedModelType.GetProperty(text);
var valToShow = propToShow.GetValue(nestedItem)?.ToString();
return valToShow;
}
return null;
}