小编Dyl*_*lan的帖子

当属性名称变化时,LINQ和JSON.NET

我试图将一些JSON内容解析为C#.对于更简单的情况,我在JSON.NET上取得了巨大的成功,并且非常感谢LINQ提供商提供的干净方法.这是一个例子,我在地图中下载有关图层的信息,并在一个叫做的类上填充一些属性(令人惊讶!)图层:

        using (var client = new WebClient())
        {
            _content = client.DownloadString(_url.AbsoluteUri + OutputFormats.Json);
        }

        JObject json = JObject.Parse(_content);
        IEnumerable<Field> fields = from f in json["fields"].Children()
                                    select new Field(
                                        (string)f["name"],
                                        (string)f["alias"],
                                        (EsriFieldType)Enum.Parse(typeof(EsriFieldType), (string)f["type"])
                                        );
        _fields = fields.ToList();
        _displayFieldName = (string)json["displayField"];
Run Code Online (Sandbox Code Playgroud)

您可以查看此URL以获取该方法的JSON的详细信息:http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/WaterTemplate/WaterDistributionNetwork/MapServer/1?f = json&pretty = true.但是当我需要将与地图图层关联的单个数据字段转换为DataTable甚至只是字典结构时,问题就出现了.问题是,与RSS提要或其他一致格式不同,字段名称和字段数量从地图图层更改为地图图层.这是我运行查询的一个例子:

    [Test]
    [Category(Online)]
    public void Can_query_a_single_feature_by_id()
    {
        var layer = _map.LayersWithName(ObjectMother.LayerWithoutOID)[0];
        layer.FindFeatureById("13141");
        Assert.IsNotNull(layer.QueryResults);
    }
Run Code Online (Sandbox Code Playgroud)

在layer.FindFeatureById中运行的代码是这个,包括我卡住的部分:

        public void FindFeatureById(string id)
    {
        var queryThis = ObjectIdField() ?? DisplayField();
        var queryUrl = string.Format("/query{0}&outFields=*&where=", OutputFormats.Json);
        var …
Run Code Online (Sandbox Code Playgroud)

c# json json.net arcgis-server

9
推荐指数
2
解决办法
8323
查看次数

编写框架的指南

我面临着编写一个框架来简化大型复杂对象库(ArcObjects)的工作.您建议创建此类框架的准则是什么?静态方法首选吗?你如何处理伐木等事情?您如何通过供应商可能引入的更改来证明您的框架代码?

我想到了我在NHibernate,log4net以及我从NLog和NetTopologySuite等项目中读过的代码的所有各种包装器和帮助器,我看到了很多好的方法,但说实话,我不知道从哪里开始.

顺便说一句 - 我在C#3.5工作,但它更多的是推荐的方法而不是语言.

frameworks

8
推荐指数
1
解决办法
6836
查看次数

从NHibernate元数据中获取类字段名称和表列名称

背景

我正在使用一个带有各种丑陋角落的遗留数据库.一点是审计.有一个表列出了应具有审计跟踪的字段的表名/字段组合.例如,如果某个行的表名为"WORKORDER"而fieldname为"STATUS",那么每当Workorder.Status属性在应用程序中发生更改时,我都需要将行添加到审计表中.我知道这个方法:NH事件或拦截器,但是在我到达那个阶段之前我有一个问题需要弄清楚.

我需要知道的是如何获取单个持久化类的键/值对列表,其中包含(a)数据库字段名称和(b)类中的关联属性名称.因此,对于我的示例,我有一个名为Workorder的类与一个名为(毫无意外)WORKORDER的表相关联.我在该Workorder类上有一个名为CurrentStatus的属性.WORKORDER表中的匹配属性是STATUS.注意属性名称和表列名称不匹配?我需要知道属性名称才能访问审计的前后数据.但我还需要知道支持列名称,以便我可以查询愚蠢的遗留"AuditTheseColumns"表.

我试过的

在我的应用程序中,我将Workorder.CurrentStatus从"TS"更改为"IP".我查看我的审计跟踪表,看到跟踪了WORKORDER.STATUS列.因此,在调用Session.SaveOrUpdate(workorder)之后,我需要找到与STATUS列关联的Workorder属性,并执行Session.Save(auditRecord)告诉它旧的("TS")和新的("IP")值.

据我所知,您可以获得有关该课程的信息:

        var fieldNames = new List<string>();
        IClassMetadata classMetadata = SessionFactory(Resources.CityworksDatasource).GetClassMetadata(typeof(T));
        int propertyCount = 0;
        foreach (IType propertyType in classMetadata.PropertyTypes)
        {
            if (propertyType.IsComponentType)
            {
                var cp = (ComponentType)propertyType;

                foreach (string propertyName in cp.PropertyNames)
                {
                    fieldNames.Add(propertyName);
                }
            }
            else if(!propertyType.IsCollectionType)
            {
                fieldNames.Add(classMetadata.PropertyNames[propertyCount + 1]);
            }

            propertyCount++;
        }
Run Code Online (Sandbox Code Playgroud)

有关该表的信息:

        var columnNames = new List<string>();
        PersistentClass mappingMeta = ConfigureCityworks().GetClassMapping(typeof(T));

        foreach (Property property in mappingMeta.PropertyIterator)
        {
            foreach (Column selectable in property.ColumnIterator)
            {
                if (columnNames.Contains(selectable.Name)) continue;
                columnNames.Add(selectable.Name);
            }
        }
Run Code Online (Sandbox Code Playgroud)

但不是在同一时间.有任何想法吗?我不知道在哪里看下一个.

nhibernate metadata

7
推荐指数
2
解决办法
8150
查看次数

使用LINQ的JSON.NET和数组

使用Json.net问题和答案查看了这个解析JSON,它接近我需要的东西.关键区别是我需要解析每个记录形成一行或多行的x,y对数组.这是我输入的一个例子

{
"displayFieldName" : "FACILITYID", 
"fieldAliases" : {
"FACILITYID" : "Facility Identifier", 
}, 
"geometryType" : "esriGeometryPolyline", 
"spatialReference" : {
  "wkid" : 4326
}, 
"features" : [
{
  "attributes" : {
    "FACILITYID" : "", 
    "OBJECTID" : 1, 
  }, 
  "geometry" : 
  {
    "paths" : 
    [
      [
        [-80.3538239379999, 27.386884271], 
        [-80.3538100319999, 27.3868901900001], 
        [-80.3538157239999, 27.3869008510001]
      ]
    ]
  }
}, 
{
  "attributes" : {
    "FACILITYID" : "", 
    "OBJECTID" : 2, 
  }, 
  "geometry" : 
  {
    "paths" : 
    [
      [
        [-80.3538239379999, 27.386884271], 
        [-80.3538295849999, 27.3868948420001] …
Run Code Online (Sandbox Code Playgroud)

c# linq json.net

5
推荐指数
1
解决办法
1万
查看次数

流畅的NHibernate和具有单列名称的复合ID

我已经在FNH谷歌集团中发布了这个帖子,但这里是独家新闻:

我在遗留数据库中有一个具有复合ID的表.好吧,PK是暗示的,因为表实际上没有定义PK,但自然PK是WORKORDERID和IMAGEPATH列的组合:

CREATE TABLE [WORKORDERIMG](
       [WORKORDERID] [varchar](50) NULL,
       [IMAGEPATH] [varchar](250) NULL,
       [WOTASKID] [numeric](10, 0) NULL,
       [ATTACHEDBY] [nvarchar](100) NULL,
       [COMMENTS] [nvarchar](256) NULL,
       [DATETIMEATTACHED] [datetime] NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我定义了这个类映射:

   /// <summary>
   /// NHibernate mapping for workorder attachments
   /// </summary>
   public class AttachmentMap : ClassMap<Attachment>
   {
       public AttachmentMap()
       {
           SchemaIs(Resources.DatabaseSchema);
           WithTable(ObjectNames.TableWorkorderAttachment);
           UseCompositeId()
               .WithKeyProperty(x => x.ParentId, "WORKORDERID")
               .WithKeyProperty(x => x.FileLocation, "IMAGEPATH");
           Map(x => x.AttachedByUser, "ATTACHEDBY").WithLengthOf(100).Nullable();
           Map(x => x.AttachedOn, "DATETIMEATTACHED").Nullable();
           Map(x => x.Comments).Nullable().WithLengthOf(256);
           References(x => x.ParentWorkorder).FetchType.Join();
       }
   }
Run Code Online (Sandbox Code Playgroud)

对于这堂课:

public class Attachment
{
   public …
Run Code Online (Sandbox Code Playgroud)

nhibernate fluent-nhibernate

4
推荐指数
1
解决办法
7594
查看次数