public static PhotosFirst PhF()
 {
     if (_phf == null)
     {
         _phf = new PhotosFirst();
     }
     return(_phf);
 }
        public void BuildPortrait()
        {
            adocauthority = this.XRecord.Elements("inverse")
                            .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/adoc")
                            .Select(i => i.Element("record"))
                            .ToArray();

            reflected_reflections = this.XRecord.Elements("inverse")
                                    .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/reflected")
                                    .Select(i => i.Element("record"))
                                    .Distinct(new IdEqual())
                                    .OrderBy(r => r.Element("direct")?.Element("record"), PhotosFirst.PhF())
                                    .ToArray();

            portraitphotouri = reflected_reflections
                               .Where(re => re.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/ground")?.Value == "portrait")
                               .Select(re => re.Element("direct")?.Element("record"))
                               .Where(r => r?.Attribute("type").Value == "http://fogid.net/o/photo-doc")
                               .FirstOrDefault()
                               ?.Elements("field")
                               .FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/uri")?.Value;

            titles = this.XRecord.Elements("inverse")
                     .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/has-title")
                     .Select(i => i.Element("record"))
                     .Select <XElement, Tuple <string, string> >(r => Tuple.Create <string, string>(
                                                                     r.Elements("field").FirstOrDefault(f => f.Attribute("prop")?.Value == "http://fogid.net/o/degree")?.Value,
                                                                     r.Elements("field").FirstOrDefault(f => f.Attribute("prop")?.Value == "http://fogid.net/o/from-date")?.Value
                                                                     ))
                     .OrderBy(t => t.Item2)
                     .ToArray();

            XElement[] participant_participation = this.XRecord.Elements("inverse")
                                                   .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/participant")
                                                   .Select(i => i.Element("record"))
                                                   .ToArray();
            work = participant_participation
                   .Where(r => r.Element("direct")?.Element("record")?.Elements("field")
                          .FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/org-classification")?.Value == "organization")
                   .ToArray();
            parties = participant_participation
                      .Where(r => r.Element("direct")?.Element("record")?.Elements("field")
                             .FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/org-classification")?.Value != "organization")
                      .ToArray();


            naming = this.XRecord.Elements("inverse")
                     .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/referred-sys")
                     .Select(i => i.Element("record"))
                     .Select <XElement, Tuple <string, string, string> >(r => Tuple.Create <string, string, string>(
                                                                             r.Elements("field").FirstOrDefault(f => f.Attribute("prop")?.Value == "http://fogid.net/o/alias")?.Value,
                                                                             r.Elements("field").FirstOrDefault(f => f.Attribute("prop")?.Value == "http://fogid.net/o/from-date")?.Value,
                                                                             r.Elements("field").FirstOrDefault(f => f.Attribute("prop")?.Value == "http://fogid.net/o/to-date")?.Value
                                                                             ))
                     .OrderBy(t => t.Item2)
                     .ToArray();
            var inorg_participation = this.XRecord.Elements("inverse")
                                      .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/in-org")
                                      .Select(i => i.Element("record"))
                                      .ToArray();

            firstfaces = inorg_participation
                         .Where(r => StaticObjects.GetField(r, "http://fogid.net/o/role-classification") == "director")
                         .ToArray();
            allparticipants = inorg_participation
                              .Where(r => StaticObjects.GetField(r, "http://fogid.net/o/role-classification") != "director")
                              .ToArray();
            //inorg_participation = this.XRecord.Elements("inverse")
            //    .Select(i => i.Element("record"))
            //    .OrderBy(r => StaticObjects.GetField(r.Element("direct").Element("record"), "http://fogid.net/o/from-date"))
            //    .ToArray();
            indocreflected = this.XRecord.Elements("inverse")
                             .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/in-doc")
                             .Select(i => i.Element("record"))
                             .ToArray();
            incollectionmember = this.XRecord.Elements("inverse")
                                 .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/in-collection")
                                 .Select(i => i.Element("record")?.Element("direct")?.Element("record"))
                                 .Where(r => r != null)
                                 .OrderBy(r => StaticObjects.GetField(r, "http://fogid.net/o/name"))
                                 .ToArray();
            orgparentorgrelatives = this.XRecord.Elements("inverse")
                                    .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/org-parent")
                                    .Select(i => i.Element("record")?.Element("direct")?.Element("record"))
                                    .Where(r => r != null)
                                    .ToArray();
        }