如何在Linqpad中禁用生成的导航属性?

时间:2017-03-31 19:46:22

标签: c# json linqpad

对于具有1:1关系的查找表,LinqPad会生成一个属性,该属性指向使用查找值的对象集合。如何禁用它?

当我尝试使用Newtonsoft.JSON序列化表时,它会导致问题。

1 个答案:

答案 0 :(得分:3)

您无法阻止LINQPad生成这些属性,但您可以告诉Newtonsoft不要使用IContractResolver序列化它们:

http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size

我的扩展程序查询中编写合同解析程序类,以便所有查询都可以使用它。在CreateProperties方法中,过滤属性的位置,您需要在属性类型上应用条件以排除导航属性。以下将排除所有n:1和1:1属性:

public class FlatResolver : DefaultContractResolver
{
  public static JsonSerializerSettings Settings =
    new JsonSerializerSettings { ContractResolver = new FlatResolver() };

  protected override IList<JsonProperty> CreateProperties (Type type, MemberSerialization memberSerialization)
  {
    IList<JsonProperty> properties = base.CreateProperties (type, memberSerialization);

    properties = properties
      .Where (p => !p.PropertyType.GetCustomAttributes (typeof (System.Data.Linq.Mapping.TableAttribute)).Any())
      .ToList();

    return properties;
  }
}

然后序列化,就这样做:

JsonConvert.SerializeObject (myObject, FlatResolver.Settings).Dump();

您可以使用类似的逻辑来排除1:n,方法是检查实体类型的IEnumerable。