public int InsertIdentificationUnit(IdentificationUnit iu, IEnumerable<IdentificationUnitAnalysis> analyses, UserCredentials login)
        {
            using (var db = login.GetConnection())
            using (var t = db.GetTransaction())
            {
                db.Insert(iu);
                db.Insert(iu.GetIdentification(login));

                db.Insert(iu.GetGeoAnalysis(login));

                var geoString = SerializeLocalization(iu.Latitude, iu.Longitude, iu.Altitude);
                if (!string.IsNullOrWhiteSpace(geoString))
                {
                    db.Execute("UPDATE [dbo].[IdentificationUnitGeoAnalysis] SET Geography=GEOGRAPHY::STGeomFromText(@0, 4326) WHERE CollectionSpecimenID=@1 AND IdentificationUnitID=@2", geoString, iu.CollectionSpecimenID, iu.CollectionUnitID);
                }

                if (analyses != null)
                    foreach (var a in analyses)
                    {
                        a.CollectionUnitID = iu.CollectionUnitID;
                        a.CollectionSpecimenID = iu.CollectionSpecimenID;
                        db.Insert(a);
                    }

                t.Complete();

                return iu.CollectionUnitID;
            }
        }
        public IObservable<Unit> InsertIdentificationUnit(IdentificationUnit iu, IEnumerable<IdentificationUnitAnalysis> analyses)
        {
            var res = InsertIUCompleted.FilterByUserState(iu)
                .PipeErrors()
                .Select(p => p.Result)
                .StoreMapping(iu, Mapping)
                .ReplayOnlyFirst();

            var svcLocs = new ObservableCollection<Svc.IdentificationUnitAnalysis>(analyses.Select(l => l.ToServiceObject()));
            _svc.InsertIdentificationUnitAsync(iu.ToServiceObject(Mapping), svcLocs, this.GetCreds(), iu);
            return res;
        }
        private void AddUnitExternalInformation(IdentificationUnit iu, Diversity db)
        {
            var id = db.SingleOrDefault<Identification>("WHERE [CollectionSpecimenID]=@0 AND [IdentificationUnitID]=@1", iu.CollectionSpecimenID, iu.CollectionUnitID);
            if (id != null)
            {
                iu.IdentificationUri = id.NameURI;
                iu.LastIdentificationCache = id.TaxonomicName;
                iu.Qualification = id.IdentificationQualifier;
                iu.AnalysisDate = (id.IdentificationYear.HasValue && id.IdentificationMonth.HasValue && id.IdentificationDay.HasValue)
                    ? new DateTime(id.IdentificationYear.Value, id.IdentificationMonth.Value, id.IdentificationDay.Value, 0, 0, 0)
                    : DateTime.Now;
            }

            iu.Altitude = db.ExecuteScalar<double?>(string.Format("SELECT [dbo].[DiversityMobile_IdentificationUnitAltitude] ( {0} )", iu.CollectionUnitID));
            iu.Latitude = db.ExecuteScalar<double?>(string.Format("SELECT [dbo].[DiversityMobile_IdentificationUnitLatitude] ( {0} )", iu.CollectionUnitID));
            iu.Longitude = db.ExecuteScalar<double?>(string.Format("SELECT [dbo].[DiversityMobile_IdentificationUnitLongitude] ( {0} )", iu.CollectionUnitID));
        }
        public int InsertIdentificationUnit(IdentificationUnit iu, IEnumerable<IdentificationUnitAnalysis> analyses, UserCredentials login)
        {
            using (var db = login.GetConnection())
            using (var t = db.GetTransaction())
            {

                db.Insert(iu);
                db.Insert(iu.GetIdentification(login));
                db.Insert(iu.GetGeoAnalysis(login));

                if (analyses != null)
                    foreach (var a in analyses)
                    {
                        a.CollectionUnitID = iu.CollectionUnitID;
                        a.CollectionSpecimenID = iu.CollectionSpecimenID;
                        db.Insert(a);
                    }

                t.Complete();

                return iu.CollectionUnitID;
            }
        }
 internal static IQueryable<IdentificationUnitAnalysis> Analyses(IdentificationUnit iu, DiversityDataContext ctx)
 {
     return from a in ctx.IdentificationUnitAnalyses
            where a.UnitID == iu.UnitID
            select a;
 }
 internal static IQueryable<IdentificationUnit> SubUnits(IdentificationUnit u, DiversityDataContext ctx)
 {
     return from iu in ctx.IdentificationUnits
            where iu.RelatedUnitID == u.UnitID
            select iu;
 }
        private void AddUnitExternalInformation(IdentificationUnit iu, Diversity db)
        {
            var id = db.SingleOrDefault<Identification>("WHERE [CollectionSpecimenID]=@0 AND [IdentificationUnitID]=@1", iu.CollectionSpecimenID, iu.CollectionUnitID);
            if (id != null)
            {
                iu.IdentificationUri = id.NameURI;
                iu.LastIdentificationCache = id.TaxonomicName;
                iu.Qualification = id.IdentificationQualifier;
                iu.AnalysisDate = (id.IdentificationYear.HasValue && id.IdentificationMonth.HasValue && id.IdentificationDay.HasValue)
                    ? new DateTime(id.IdentificationYear.Value, id.IdentificationMonth.Value, id.IdentificationDay.Value, 0, 0, 0)
                    : DateTime.Now;
            }

            AddLocalization(iu, db);
        }
 private void AddLocalization(IdentificationUnit iu, Diversity db)
 {
     // The decimal -> double dance ensures the coordinates round trip correctly
     iu.Altitude = DecimalToDouble(db.SingleOrDefault<decimal?>("SELECT CAST([Geography].Z AS DECIMAL(25, 20)) FROM [IdentificationUnitGeoAnalysis] WHERE [CollectionSpecimenID]=@0 AND [IdentificationUnitID]=@1", iu.CollectionSpecimenID, iu.CollectionUnitID));
     var lat = db.SingleOrDefault<decimal?>("SELECT CAST([Geography].Lat AS DECIMAL(25, 20)) FROM [IdentificationUnitGeoAnalysis] WHERE [CollectionSpecimenID]=@0 AND [IdentificationUnitID]=@1", iu.CollectionSpecimenID, iu.CollectionUnitID);
     iu.Latitude = DecimalToDouble(lat);
     var lon = db.SingleOrDefault<decimal?>("SELECT CAST([Geography].Long AS DECIMAL(25, 20)) FROM [IdentificationUnitGeoAnalysis] WHERE [CollectionSpecimenID]=@0 AND [IdentificationUnitID]=@1", iu.CollectionSpecimenID, iu.CollectionUnitID);
     iu.Longitude = DecimalToDouble(lon);
 }