/// <summary> /// Gets one object, selected by id and an optional predicate /// </summary> /// <typeparam name="T"></typeparam> /// <param name="db"></param> /// <param name="id"></param> /// <param name="additionalPredicate"></param> /// <param name="args"></param> /// <returns></returns> public static T Get <T>(this IAccessDb db, object id, string additionalPredicate = null, params object[] args) { id.MustNotBeNull("id"); var tp = typeof(T); if (typeof(ExpandoObject) == tp || typeof(object) == tp) { throw new InvalidOperationException("Can't work with System.Object or dynamic types"); } var ti = TableInfo.ForType(tp); if (ti.SelectSingleSql == null) { var sb = new StringBuilder("select "); var p = tp.GetProperties().Where(pr => !pr.PropertyType.IsCustomObjectType()).Select(pr => pr.Name); foreach (var name in p) { sb.AppendFormat("{0},", db.Provider.EscapeName(name)); } sb.Remove(sb.Length - 1, 1); sb.AppendFormat(" from {0}", db.Provider.EscapeName(ti.Name)); sb.AppendFormat(" where {0}=@0", db.Provider.EscapeName(ti.PrimaryKey)); if (!string.IsNullOrEmpty(additionalPredicate)) { sb.AppendFormat(" and {0}", additionalPredicate); } ti.SelectSingleSql = sb.ToString(); } var fargs = new List <object>(args.Length + 1); fargs.Add(id); fargs.AddRange(args); return(db.FirstOrDefault <T>(ti.SelectSingleSql, fargs.ToArray())); }
/// <summary> /// Selects first row matching criteria and maps it to poco /// </summary> /// <typeparam name="T"></typeparam> /// <param name="db"></param> /// <param name="condition"></param> /// <returns></returns> public static T Get <T>(this IAccessDb db, Expression <Func <T, bool> > condition) { var builder = new ExpressionSqlBuilder <T>(db.Provider.BuilderHelper); builder .WriteSelect() .WriteSelectAllColumns() .WriteFrom() .Where(condition); return(db.FirstOrDefault <T>(builder.ToString(), builder.Parameters.ToArray())); }