我目前有以下代码:
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的更新值
答案 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, ', ') + ")");
这对你有帮助吗?