gpt4 book ai didi

entity-framework-core - .Net EF Core 2.1 从 IQueryable 参数获取 DbContext

转载 作者:行者123 更新时间:2023-12-03 20:16:26 28 4
gpt4 key购买 nike

我有一个 IQueryable 扩展方法:

public static void SomeExt<T>(this IQueryable<T> query, DbContext context) {...}

我想知道是否有某种方法可以从查询中获取 DbContext 以便可以删除 DbContext 参数,只留下:
public static void SomeExt<T>(this IQueryable<T> query) {...}

我试过这样的事情
Access DataContext behind IQueryable
但它不起作用,得到零字段。

还有一种方法可以从 DbSet 获取它
Can you get the DbContext from a DbSet?
myDbSet.GetService<'ICurrentDbContext>().Context;
但这不是我需要的。我想从 Query 中获取它?

这是查询:
var q = context.Items.Where(a => a.StatusId = 1);

q.SomeExt(上下文);
对比
q.SomeExt();

最佳答案

我找到了一种方法来做到这一点

public static DbContext GetDbContext(IQueryable query)
{
var bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
var queryCompiler = typeof(EntityQueryProvider).GetField("_queryCompiler", bindingFlags).GetValue(query.Provider);
var queryContextFactory = queryCompiler.GetType().GetField("_queryContextFactory", bindingFlags).GetValue(queryCompiler);

var dependencies = typeof(RelationalQueryContextFactory).GetProperty("Dependencies", bindingFlags).GetValue(queryContextFactory);
var queryContextDependencies = typeof(DbContext).Assembly.GetType(typeof(QueryContextDependencies).FullName);
var stateManagerProperty = queryContextDependencies.GetProperty("StateManager", bindingFlags | BindingFlags.Public).GetValue(dependencies);
var stateManager = (IStateManager)stateManagerProperty;

return stateManager.Context;
}

对于 EFCore 3 而不是
.GetProperty("Dependencies", bindingFlags)


.GetField("_dependencies", bindingFlags)

关于entity-framework-core - .Net EF Core 2.1 从 IQueryable 参数获取 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53198376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com