public EntityMetadataQueryHandler(object entity, IDocumentStorage storage, IDocumentMapping mapping)
        {
            _id      = storage.Identity(entity);
            _storage = storage;
            _mapping = mapping;

            var fieldIndex = 0;

            _fields = new Dictionary <string, int>
            {
                { DocumentMapping.VersionColumn, fieldIndex++ },
                { DocumentMapping.LastModifiedColumn, fieldIndex++ },
                { DocumentMapping.DotNetTypeColumn, fieldIndex++ }
            };

            var queryableDocument = _mapping.ToQueryableDocument();

            if (queryableDocument.SelectFields().Contains(DocumentMapping.DocumentTypeColumn))
            {
                _fields.Add(DocumentMapping.DocumentTypeColumn, fieldIndex++);
            }
            if (queryableDocument.DeleteStyle == DeleteStyle.SoftDelete)
            {
                _fields.Add(DocumentMapping.DeletedColumn, fieldIndex++);
                _fields.Add(DocumentMapping.DeletedAtColumn, fieldIndex++);
            }

            if (_mapping.TenancyStyle == TenancyStyle.Conjoined)
            {
                _fields.Add(TenantIdColumn.Name, fieldIndex);
            }
        }
示例#2
0
        private IWhereFragment findWhereFragment <T>(Expression <Func <T, bool> > @where, IDocumentMapping mapping)
        {
            QueryModel queryModel;

            using (var session = _store.QuerySession())
            {
                queryModel = session.Query <T>().Where(@where).As <MartenQueryable <T> >().ToQueryModel();
            }

            var wheres = queryModel.BodyClauses.OfType <WhereClause>().ToArray();

            if (wheres.Length == 0)
            {
                throw new InvalidOperationException();
            }

            var whereFragment = _store.Parser.ParseWhereFragment(mapping.ToQueryableDocument(), wheres.First().Predicate);

            mapping.ToQueryableDocument().FilterDocuments(queryModel, whereFragment);

            return(whereFragment);
        }