如何获取实体框架查询中涉及的Entites类型?

时间:2015-09-08 20:02:33

标签: c# entity-framework entity-framework-6

如果我有以下的EF查询:

var model = testContext.PurchaseOrders
               .Include(order => order.CompanyAccountingCodeNumber)
               .Include(order => order.CompanyAccountingCodeNumber.AccountingCode);

无论如何都要找出特定查询中涉及的EF实体的类型。例如,这涉及:

Test.Models.PurchaseOrder
Test.Models.CompanyAccountingCodeNumber
Test.Models.AccountingCode

所以我希望能够获得IEnumerable种类型以便我可以获得名称空间等?

我假设这样的事情是可能的 - Automapper支持Project().To<>,它会确定哪些包含是必需的。所以我想使用include属性的反射会给我他们的类型。

2 个答案:

答案 0 :(得分:0)

如何在存储库中实现这些LINQ查询,然后在最后一个方法调用中将涉及的实体类型存储在某些存储库属性中?

public interface IWithInvolvedDomainObjects 
{
     IEnumerable<Type> LatestInvolvedDomainObjectTypes { get; }
}

public interface IPurchaseRepository : IWithInvolvedDomainObjects 
{
     IEnumerable<PurchaseOrder> GetPurchaseOrders();
}

public class PurchaseRepository : IPurchaseRepository
{
      public IEnumerable<Type> LatestInvolvedDomainObjectTypes { get; private set; }

      public IEnumerable<PurchaseOrder> GetPurchaseOrders()
      {
           LatestInvolvedDomainObjectTypes = new[]
           {
                typeof(PurchaseOrder)
           };

           return testContext.PurchaseOrders
               .Include(order => order.CompanyAccountingCodeNumber)
               .Include(order => order.CompanyAccountingCodeNumber.AccountingCode);

      }
}

答案 1 :(得分:0)

我没有时间为此生成工作代码,但每个IQueryable都有一个Expression属性,其中包含一个表达式树,表示已对该{{{1}进行的各种链式调用。 1}}。理论上,您可以深入研究表达式树并反映其中的表达式,以尝试确定“触摸”的内容。

为了获得最大收益,我建议扩展ExpressionVisitor类,让您轻松深入遍历表达式树,并覆盖您认为可能的表达式类型的特定方法为您提供您感兴趣的信息(如会员访问表达式)。在每个被覆盖的方法中,在私有字段中捕获所需的信息,然后IQueryable

尽管如此,这甚至是可能的,但我怀疑它是否真的是一个好主意。根据我的经验,最好让一个类负责缓存特定类型的DTO,并且在该类中,我放置了几个事件监听器,负责在数据中进行某些类型的更改时使特定的缓存条目无效。