.NET Framework 4.8 (EF 6) 代码到 .NET 6 (EF Core 6)

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

我正在尝试将 .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

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.