public Tuple<IndivDescs, Exception> GetDataSetIndivs(StatDataSet oSet)
 {
     if (oSet == null)
     {
         return new Tuple<IndivDescs, Exception>(null, new ArgumentNullException());
     }
     IndivDescs oRet = null;
     Exception err = null;
     try
     {
         using (var ctx = getContext())
         {
             DbDataSet pSet = findDataSet(ctx, oSet);
             if (pSet == null)
             {
                 return new Tuple<IndivDescs, Exception>(oRet, err);
             }
             DbVariable pIdVar = null;
             DbVariable pNameVar = null;
             DbVariable pImageVar = null;
             var q = from x in pSet.Variables select x;
             foreach (var v in q)
             {
                 if (v.IsId)
                 {
                     pIdVar = v;
                 }
                 if (v.IsName)
                 {
                     pNameVar = v;
                 }
                 if (v.IsImageVar)
                 {
                     pImageVar = v;
                 }
             }// v
             bool bImageInt = false;
             if (pImageVar != null)
             {
                 String s = pImageVar.VarType.Trim().ToLower();
                 if ((s != "string") && (s != "bool"))
                 {
                     bImageInt = true;
                 }
             }
             List<IndivDesc> oList = new List<IndivDesc>();
             var indexes = (from x in ctx.DbValues where x.Variable.DataSetId == pSet.Id select x.Index).Distinct();
             foreach (var ind in indexes)
             {
                 IndivDesc pp = new IndivDesc();
                 pp.IndivIndex = ind;
                 if (pIdVar != null)
                 {
                     var qx = from x in ctx.DbValues where (x.VariableId == pIdVar.Id) && (x.Index == ind) select x;
                     if (qx.Count() > 0)
                     {
                         pp.IdString = qx.First().Value;
                     }
                 }// Id
                 if (pNameVar != null)
                 {
                     var qx = from x in ctx.DbValues where (x.VariableId == pNameVar.Id) && (x.Index == ind) select x;
                     if (qx.Count() > 0)
                     {
                         pp.Name = qx.First().Value;
                     }
                 }// name
                 if (pImageVar != null)
                 {
                     var qx = from x in ctx.DbValues where (x.VariableId == pImageVar.Id) && (x.Index == ind) select x;
                     if (qx.Count() > 0)
                     {
                         var px = qx.First();
                         String sx = StatHelpers.ConvertValue(px.Value);
                         if (!String.IsNullOrEmpty(sx))
                         {
                             if (bImageInt)
                             {
                                 double dval = 0.0;
                                 if (double.TryParse(sx, out dval))
                                 {
                                     int ival = (int)dval;
                                     if (ival != 0)
                                     {
                                         var qz = from x in ctx.DbPhotoes where x.Id == ival select x;
                                         if (qz.Count() > 0)
                                         {
                                             var pz = qz.First();
                                             pp.PhotoId = pz.Id;
                                             pp.PhotoData = pz.DataBytes;
                                         }
                                     }// ival
                                 }
                             }
                             else
                             {
                                 var qz = from x in ctx.DbPhotoes where x.Name.Trim().ToLower() == sx.ToLower() select x;
                                 if (qz.Count() > 0)
                                 {
                                     var pz = qz.First();
                                     pp.PhotoId = pz.Id;
                                     pp.PhotoData = pz.DataBytes;
                                 }
                             }// ival
                         }// sx
                     }
                 }// photo
                 ValueDescs vv = new ValueDescs();
                 var qq = from x in ctx.DbValues where (x.Variable.DataSetId == pSet.Id) && (x.Index == ind) select x;
                 foreach (var v in qq)
                 {
                     ValueDesc fx = new ValueDesc();
                     convertValue(v, fx);
                     vv.Add(fx);
                 }// v
                 pp.Values = vv;
                 oList.Add(pp);
             }// ind
             if (oList.Count > 1)
             {
                 oList.Sort();
             }
             oRet = new IndivDescs(oList);
         }// ctx
     }// try
     catch (Exception ex)
     {
         err = ex;
     }
     return new Tuple<IndivDescs, Exception>(oRet, err);
 }
 private Task<Tuple<StatDataSet, Exception>> readDataSet(String filename,
     sds.DataSet input, CancellationToken cancellationToken, IProgress<int> progress)
 {
     return Task.Run<Tuple<StatDataSet, Exception>>(() =>
     {
         StatDataSet oSet = null;
         Exception err = null;
         try
         {
             FileInfo info = new FileInfo(filename);
             oSet = new StatDataSet();
             oSet.Name = info.Name;
             var col = input.Variables;
             int nTotal = col.Count;
             int nCur = 0;
             foreach (var v in col)
             {
                 if (progress != null)
                 {
                     progress.Report(nCur++);
                 }
                 if (v.Dimensions.Count != 1)
                 {
                     continue;
                 }
                 VariableDesc vv = new VariableDesc();
                 ValueDescs vals = new ValueDescs();
                 vv.Name = v.Name;
                 Type t = v.TypeOfData;
                 if (t == typeof(String))
                 {
                     vv.DataType = "string";
                     vv.IsCategVar = true;
                     String[] data = input.GetData<String[]>(v.ID);
                     if ((data != null) && (data.Length > 0))
                     {
                         for (int i = 0; i < data.Length; ++i)
                         {
                             ValueDesc vx = new ValueDesc();
                             vx.Index = i;
                             vx.DataStringValue = data[i];
                             vals.Add(vx);
                         }// i
                     }// data
                 }
                 else if (t == typeof(double))
                 {
                     vv.DataType = "double";
                     vv.IsCategVar = false;
                     double[] data = input.GetData<double[]>(v.ID);
                     if ((data != null) && (data.Length > 0))
                     {
                         for (int i = 0; i < data.Length; ++i)
                         {
                             ValueDesc vx = new ValueDesc();
                             vx.Index = i;
                             String s = Convert.ToString(myconvert(data[i]));
                             vx.DataStringValue = s;
                             vals.Add(vx);
                         }// i
                     }// data
                 }
                 else if (t == typeof(float))
                 {
                     vv.DataType = "float";
                     vv.IsCategVar = false;
                     float[] data = input.GetData<float[]>(v.ID);
                     if ((data != null) && (data.Length > 0))
                     {
                         for (int i = 0; i < data.Length; ++i)
                         {
                             ValueDesc vx = new ValueDesc();
                             vx.Index = i;
                             String s = Convert.ToString(myconvert(data[i]));
                             vx.DataStringValue = s;
                             vals.Add(vx);
                         }// i
                     }// data
                 }
                 else if (t == typeof(int))
                 {
                     vv.DataType = "int";
                     vv.IsCategVar = false;
                     int[] data = input.GetData<int[]>(v.ID);
                     if ((data != null) && (data.Length > 0))
                     {
                         for (int i = 0; i < data.Length; ++i)
                         {
                             ValueDesc vx = new ValueDesc();
                             vx.Index = i;
                             String s = Convert.ToString(data[i]);
                             vx.DataStringValue = s;
                             vals.Add(vx);
                         }// i
                     }// data
                 }
                 else if (t == typeof(short))
                 {
                     vv.DataType = "short";
                     vv.IsCategVar = false;
                     short[] data = input.GetData<short[]>(v.ID);
                     if ((data != null) && (data.Length > 0))
                     {
                         for (int i = 0; i < data.Length; ++i)
                         {
                             ValueDesc vx = new ValueDesc();
                             vx.Index = i;
                             String s = Convert.ToString(data[i]);
                             vx.DataStringValue = s;
                             vals.Add(vx);
                         }// i
                     }// data
                 }
                 else if (t == typeof(bool))
                 {
                     vv.DataType = "bool";
                     vv.IsCategVar = true;
                     bool[] data = input.GetData<bool[]>(v.ID);
                     if ((data != null) && (data.Length > 0))
                     {
                         for (int i = 0; i < data.Length; ++i)
                         {
                             ValueDesc vx = new ValueDesc();
                             vx.Index = i;
                             String s = Convert.ToString(data[i]);
                             vx.DataStringValue = s;
                             vals.Add(vx);
                         }// i
                     }// data
                 }
                 vv.Values = vals;
                 oSet.Variables.Add(vv);
             }// v
         }
         catch (Exception ex)
         {
             err = ex;
         }
         return new Tuple<StatDataSet, Exception>(oSet, err);
     }, cancellationToken);
 }// readDataSet