2014-01-25 40 views
0

我想通过我的EF实体代码的第一个对象的所有属性循环。我只想要我定义的属性。但是,当我这样做时,它包括一个属性 “RelationshipManager”,我真的不想要。EF对象的GetProperties:需要忽略“RelationshipManager”

这里是对象:

public class SchoolYear 
{ 
     [Key] 
     public virtual int SchoolYearId { get; set; } 
     public virtual string SchoolYearName { get; set; } 
} 

这里是代码:

public static string plistFromObject<T>(List<T> data) 
{ 
      string plist = ""; 

      plist = plist + "<array>\r\n"; 

      foreach (var item in data) 
      { 
       // I want to exclude "relationshipmanager" 

       List<string> props = item.GetType().GetProperties(BindingFlags.DeclaredOnly |  BindingFlags.Public | BindingFlags.Instance).Select(p => p.Name).ToList(); 

       plist = plist + "<dict>\r\n"; 

       foreach (var prop in props) 
       { 
        var val = item.GetType().GetProperty(prop).GetValue(item, null).ToString(); 

        plist = plist + "<key>" + prop + "</key>\r\n"; 
        plist = plist + "<string>" + System.Web.HttpUtility.HtmlEncode(val) + "</string>\r\n"; 
       } 

      plist = plist + "</dict>\r\n"; 
     } 

     return plist; 
    } 

通话

[WebMethod] 
    public string GetSchoolYears() 
    { 
     var db = new MyEntities(); 

     var results = (from i in db.SchoolYears 
         select i).ToList(); 


     return Library.Common.plistFromObject(results); 
    } 
+0

你的物体的其余部分在哪里? 'RelationshipManager'在哪里定义?这将是一个很大的线索。 –

+1

另外,请自己做个大忙,不要使用字符串操作来构建XML。改为使用LINQ to XML。如果你坚持字符串操作,至少应该使用'StringBuilder'。 –

+0

我不知道relationshipmanager在哪里定义。它是EF的一部分吗?或对象的默认属性?谢谢你的建议。我将切换到XML或使用字符串生成器。 – Arcadian

回答

0

使用托尼的答案:我能够这样做,而不必过滤掉EF动态属性。这会得到我物体的实际类型

var xml = new XElement(
         "array", 
         data.Select(d => 
         new XElement("dict",ObjectContext.GetObjectType(d.GetType ()).GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance) 

               .Select(
               p => new[] { 
               new XElement("key",p.Name), 
                new XElement("string", p.GetValue(d, null)) } 
                 ) 
              ) 
           )); 
2

试试这样说:

var xml = new XElement(
     "array", 
     data.Select(d => 
      new XElement("dict", 
      d.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance) 
      .Where(p => p.Name != "RelationshipManager") 
      .Select(
       p => new [] { 
        new XElement("key",p.Name), 
        new XElement("string", p.GetValue(d, null)) } 
      ) 
     ) 
    )); 

请参阅demo

答案是,EF不是完全与您的类一起工作,而是使用特殊的动态生成的代理类,因此即使您没有此类属性,EF也可以添加它。查看更多details

+0

谢谢。有效。 – Arcadian

+0

这是一个很好的使用linq到xml的例子..但实际上并没有回答“RelationshipManager”字段来自哪里的问题。 – Arcadian

+0

@ magic-c0d3r答案是,EF不是完全适合你的类,而是使用特殊的动态生成的代理类,所以即使你没有这样的属性,EF也可以添加它。查看更多详细信息:http://msdn.microsoft.com/en-us/data/jj592886.aspx – Tony