我正在尝试将 .NET Framework 4.8 (EF 6) 应用程序转换为 .NET 6 (EF Core 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 6 中工作,但我尝试的一切都失败了......
有什么帮助吗?
更新
好的,根据评论,我会尝试提供更多信息...
基本上这有两部分:第一个部分是获取正确的数据库集,第二个部分是查询它以获得所需的值。
第二部分:
.Where(propIdent.Name + "== @0", val)
好吧,我虽然这是标准的 LINQ,但这似乎来自于使用
System.Linq.Dynamic.Core
(Dai 评论让我深入研究它,所以谢谢)
(检查[https://www.nuget.org/packages/System.Linq.Dynamic.Core/][1])
抱歉,这是一个旧项目,我什至不知道它正在使用额外的 nuget 包。
nuget 似乎也适用于 .NET,所以我已将其安装在新项目中,现在这部分代码没有显示错误...但我无法确定它是否会工作,直到我可以第一部分工作(获取数据库集)...
更新#2
好吧,我发誓我为此浪费了几个小时,将其发布到此处后,我在几分钟内就解决了它。哦天哪...
最后:
1.安装nuget包
System.Linq.Dynamic.Core
2.从另一个SO答案中添加了此方法:https://stackoverflow.com/a/59496444
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());
// Build a method with the specific type argument you're interested in
method = method.MakeGenericMethod(T);
return method.Invoke(context, null) as IQueryable;
}
3.那么我修正的方法是:
private async Task<string> someMethod(PropertyInfo propModel, string ident, string text, string val)
{
Type nestedModel = propModel.PropertyType;
//DbSet nestedModelDbset = db.Set(nestedModel);
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;
}
瞧,它起作用了!
我喜欢这个网站XD
我相信此代码将对您有益:
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;
}