我正在编写一个IQueryable<T>
扩展方法,我想获得T
导航属性的外键。我已经发现我可以通过IModel.FindEntityType(T).GetNavigations()
访问它们,问题是如何最好地访问IModel
,同时保持方法尽可能简单。
目前的方法看起来像这样:
public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query, IModel model)
{
var entity = model.FindEntityType(entityType);
var navigationProperties = entity.GetNavigations();
...
}
如果我不需要通过IModel
作为这样的论点,我会很高兴:
public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query)
{
var entity = Model.FindEntityType(entityType);
var navigationProperties = entity.GetNavigations();
...
}
我已经考虑添加一个IServiceCollection
扩展方法,并传递DbContext
,并将IModel
设置为IQueryable<T>
扩展方法的静态属性。问题是它将我限制在一个DbContext
。
我还研究了向DbContextOptionsBuilder
添加扩展方法的选项,但还没有真正找到实现我想要的方法的最佳方法。
也许还有其他方法可以访问外键?非常感谢您的帮助!
编辑
从导航属性中,我想访问ForeignKey
-属性,以了解用于解析导航属性的属性。类似于:
navigationProperties.ToList().Select(x => x.ForeignKey);
获取导航属性的一种方法:
public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query)
{
var navigationProperties = typeof(TQuery).GetProperties()
.Where(p => (typeof(IEnumerable).IsAssignableFrom(p.PropertyType) && p.PropertyType != typeof(string)))
.ToArray();
...
}
更新:尝试从IQueryable
中获取具有Model
属性的DbContext
会导致一些不漂亮的代码,此链接显示了如何做到这一点:
Net EF Core 2.1从IQueryable参数获取DbContext
如果使用依赖项注入,可以将DbContext的实例放入web请求或操作范围内的容器中,并使用DoMagic
方法将其注入类中。
另一种方法可以将该方法添加到DbContext
类的子代,这样就不需要模型参数。