private string BuildQueryString(IDatabase database) { var queryExpression = RelatedMetadata.BuildQueryExpression(database); _primaryKeyIndex = -1; if (RelatedMetadata.PrimaryKeyProperty != null) { var primaryKeyFieldName = RelatedMetadata.GetFieldMetadata(RelatedMetadata.PrimaryKeyProperty).FieldName; int index = 0; foreach (var metadata in RelatedMetadata.AllFieldMetadata.Values) { if (primaryKeyFieldName == metadata.FieldName) { _primaryKeyIndex = index; break; } index++; } } CustomizeQuery(queryExpression); return(database.BuildQueryString(queryExpression)); }
/// <summary> /// Initializes a new instance of the <see cref="DatabaseModelCollectionSearchMetadata{T}"/> class. /// </summary> /// <param name="searchProperty">The property to filter on.</param> /// <param name="searchType">How to filter the data.</param> /// <exception cref="ArgumentException"> /// <paramref name="searchType"/> is not supported /// or /// <paramref name="searchProperty"/> is not a string property. /// </exception> protected DatabaseModelCollectionSearchMetadata(ModelProperty searchProperty, SearchType searchType) { if (searchType == SearchType.None) { throw new ArgumentException("searchType"); } var metadata = RelatedMetadata.GetFieldMetadata(searchProperty) as StringFieldMetadata; if (metadata == null) { throw new ArgumentException("searchProperty does not map to a string field", "searchProperty"); } _searchField = metadata.FieldName; _searchType = searchType; AreResultsReadOnly = true; }
/// <summary> /// Populates a collection with items from a database. /// </summary> /// <param name="models">The uninitialized collection to populate.</param> /// <param name="maxResults">The maximum number of results to return</param> /// <param name="primaryKey">The primary key of the model to populate.</param> /// <param name="database">The database to populate from.</param> /// <returns><c>true</c> if the model was populated, <c>false</c> if not.</returns> protected virtual bool Query(ICollection <TCollection> models, int maxResults, object primaryKey, IDatabase database) { if (_queryString == null) { _queryString = BuildQueryString(database); } var databaseDataModelSource = ServiceRepository.Instance.FindService <IDataModelSource>() as DatabaseDataModelSource; using (var query = database.PrepareQuery(_queryString)) { query.Bind(FilterValueToken, primaryKey); if (_primaryKeyIndex == -1) { while (query.FetchRow()) { TModel item = new TModel(); RelatedMetadata.PopulateItem(item, database, query); models.Add(item); if (--maxResults == 0) { break; } } } else { while (query.FetchRow()) { TModel item; int id = query.GetInt32(_primaryKeyIndex); if (databaseDataModelSource != null) { item = databaseDataModelSource.TryGet <TModel>(id); if (item != null) { if (!models.Contains(item)) { models.Add(item); if (--maxResults == 0) { break; } } continue; } } item = new TModel(); RelatedMetadata.PopulateItem(item, database, query); if (databaseDataModelSource != null) { item = databaseDataModelSource.TryCache <TModel>(id, item); } models.Add(item); if (--maxResults == 0) { break; } } } } return(true); }