C# 使用反射过滤/删除EF5导航属性

C# 使用反射过滤/删除EF5导航属性,c#,excel,entity-framework,asp.net-mvc-4,reflection,C#,Excel,Entity Framework,Asp.net Mvc 4,Reflection,我有以下代码来获取传入的泛型实体的所有属性。我认为这样的属性会成为excel报告的好标题。但当我使用它时,我会得到一堆“导航”属性。我想把他们过滤掉,因为他们把报告弄乱了。这里有一些代码 DataTable dataTable = new DataTable(typeof(TEntity).Name); //Get properties / field names PropertyInfo[] Props = typeof(TEntity).GetProperties(BindingFlags

我有以下代码来获取传入的泛型实体的所有属性。我认为这样的属性会成为excel报告的好标题。但当我使用它时,我会得到一堆“导航”属性。我想把他们过滤掉,因为他们把报告弄乱了。这里有一些代码

DataTable dataTable = new DataTable(typeof(TEntity).Name);

//Get properties / field names
PropertyInfo[] Props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);

//Add props to datatable
foreach (PropertyInfo prop in Props)
    dataTable.Columns.Add(prop.Name);
因此,代码继续向datatable添加其他行,然后我使用datatable将数据发送到优秀的NPOI免费excel导出工具

理想情况下,是否有BindingFlags属性允许我忽略以下内容

| !BindingFlags.Navigation
我也不需要其他2个,因为我得到了相同的细节,无论有没有它们

如果没有BindingFlags属性,是否有扩展它的方法

如果没有,那么是否有其他可靠检测它们的标准方法,以便我可以过滤掉它们

我听说其中一些包含“导航”作为前缀,或者几乎总是虚拟的,但我的似乎都是虚拟的,而“几乎”部分让我担心。这就是为什么我不想做这样的事情:

PropertyInfo[] Props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => !p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal).ToArray();
然而,我的没有“导航”前缀,我可以看到,但如果他们有,我也不相信这会给我正确的方式

也许我对以上两个问题的看法是错误的,或者我没有找准正确的地方

我还完成了生成“ViewModel”之类的东西,它连接到一个repo,从模型中获取数据并填充ViewModel。然后将其发送到我的报告引擎。这看起来更灵活,因为如果我附加一个视图,我可以像预览一样使用它。这听起来是正确的方法吗


提前感谢…

以及Francis的建议,您可以使用DbContext的元数据(类似于下面的内容)来获取给定实体类型的导航属性:

public static PropertyInfo[] GetNavigationProperties<TEntity>(DbContext context)
        where TEntity: class
    {
        var objContext = ((IObjectContextAdapter)context).ObjectContext;
        var elementType = objContext.CreateObjectSet<TEntity>().EntitySet.ElementType;
        return elementType.NavigationProperties.Select(prop => typeof(TEntity).GetProperty(prop.Name)).ToArray();
    }
publicstaticpropertyinfo[]GetNavigationProperties(DbContext上下文)
地点:班级
{
var objContext=((IObjectContextAdapter)context).ObjectContext;
var elementType=objContext.CreateObjectSet().EntitySet.elementType;
返回elementType.NavigationProperties.Select(prop=>typeof(tenty).GetProperty(prop.Name)).ToArray();
}
然后,您可以过滤您的属性(不包括导航属性),您可以编写如下代码:

var dataTable = new DataTable(typeof(TEntity).Name);
var navProperties = GetNavigationProperties<TEntity>(ctx);

var props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);

//Add props to datatable
foreach (var prop in props.Except(navProperties))
    dataTable.Columns.Add(prop.Name);
var dataTable=新数据表(typeof(tenty).Name);
var navProperties=GetNavigationProperties(ctx);
var props=typeof(tenty).GetProperties(BindingFlags.Public | BindingFlags.Instance);
//向数据表添加道具
foreach(道具中的var道具,除了(导航属性))
dataTable.Columns.Add(prop.Name);

您有权访问数据库上下文吗?如果是这样,您可以(通过IObjectContextAdapter.GetMetadataWorkspace)查询DbContext元数据,以了解有关entitytype的更多信息。@user3411327-我确实有权访问上下文。你知道怎么做吗?谢谢你的回复。我会在下一两个周末试试这个。谢谢你的帮助。