有没有办法从入口获取每个值。首先在ef代码中收集?

时间:2015-09-02 14:08:57

标签: c# .net entity-framework ef-code-first entity

我目前有以下代码:

 System.Reflection.PropertyInfo[] names = _entity.GetType().GetProperties();
            var entry = this.Entry(_entity);
            foreach (var property in names)
            {
                var m = entry.Member(property.Name);
                if (m is DbPropertyEntry)//simple property
                {
                    var p = entry.Property(property.Name);
                    currentVal.Add(p.CurrentValue.ToString());
                }
                if (m is DbReferenceEntry)//navigation to single object
                {
                    var r = entry.Reference(property.Name);
                    currentVal.Add(r.CurrentValue.ToString());
                }
                if (m is DbCollectionEntry)//navigation to collection
                {
                    var c = entry.Collection(property.Name);
                    currentVal.Add(c.CurrentValue.ToString());               
                }
            }

我想从与我的实体关联的集合中获取每个字段值,但是entry.Collection(property.Name)只返回集合名称而不是该集合中的字段,例如其名称,id等。因此我实际上无法获得集合中的当前值。

任何建议都非常感谢! 感谢

编辑:

与我合作的实体设置如下:

 public class Project
    {

        public int Id { get; set; } // PK
        public string Name { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public int MarketId { get; set; } // FK
        [ForeignKey("MarketId")]
        public Market Market { get; set; } // FK Nav   
        public ICollection<Team> Teams { get; set; } // Many to Many Nav 
    }

我想查看的集合是团队,我正在为这个实体进行审核,当创建一个新项目时,我希望在团队表中看到相关项目ID的更新值

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么您希望遍历实体集合中的项目。一种方法是将c.CurrentValue转换为IEnumerable,然后使用foreach循环遍历可枚举。

foreach(var x in (IEnumerable) c.CurrentValue){
  // do something with the entity here
}

这将为您提供集合中的实体。根据您对它们的处理方式,您可以使用ToString()实体本身,或者递归地使用您发布的代码来获取它们的属性值。

需要注意的一点是,EF并没有急切地加载集合属性。因此,当数据库中的集合不为空时,集合在内存中可能是空的。 DbCollectionEntry类型具有IsLoaded属性来检查它。

答案 1 :(得分:0)

好吧,我想你想根据一系列字符串制作一个Select,它们是属性&#39;名。我对吗?。

您是否尝试过使用Linq Dynamic? http://dynamiclinq.azurewebsites.net/。它允许您使用字符串表达式构造LINQ查询。

var result = myQuery
    .Select("new (Field1, Field2)");

//in your case
 var result2 = myQuery
    .Select("new (" + string.Join(fields, ', ') + ")");

这对你有帮助吗?