.NET Framework 4.8 (EF6) 代码到 .NET Core(.NET6、EFCore6)

问题描述 投票:0回答:1

我正在尝试将 .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,所以我已将其安装在新项目中,现在该部分代码没有显示错误...但在我拥有第一部分之前,我无法确定它是否会工作工作(获取数据库集)...

c# .net-core entity-framework-core .net-6.0
1个回答
0
投票

我相信此代码将对您有益:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.