コード例 #1
0
ファイル: DefaultQuery.cs プロジェクト: lurumad/yessql
            protected async Task <T> FirstOrDefaultImpl()
            {
                // Commit any pending changes before doing a query (auto-flush)
                await _query._session.CommitAsync();

                _query.Page(1, 0);

                if (typeof(IIndex).IsAssignableFrom(typeof(T)))
                {
                    _query._sqlBuilder.Selector("*");
                    var sql = _query._sqlBuilder.ToSqlString(_query._dialect);
                    return((await _query._connection.QueryAsync <T>(sql, _query._sqlBuilder.Parameters, _query._transaction)).FirstOrDefault());
                }
                else
                {
                    _query._sqlBuilder.Selector(_query._documentTable, "Id");
                    var sql = _query._sqlBuilder.ToSqlString(_query._dialect);
                    var ids = (await _query._connection.QueryAsync <int>(sql, _query._sqlBuilder.Parameters, _query._transaction)).ToArray();

                    if (ids.Length == 0)
                    {
                        return(default(T));
                    }

                    return(await _query._session.GetAsync <T>(ids[0]));
                }
            }
コード例 #2
0
            protected async Task <T> FirstOrDefaultImpl()
            {
                // Commit any pending changes before doing a query (auto-flush)
                await _query._session.CommitAsync();

                _query.Page(1, 0);

                if (typeof(IIndex).IsAssignableFrom(typeof(T)))
                {
                    _query._sqlBuilder.Selector("*");
                    var sql = _query._sqlBuilder.ToSqlString();
                    var key = new WorkerQueryKey(sql, _query._sqlBuilder.Parameters);
                    return((await _query._session._store.ProduceAsync(key, async() =>
                    {
                        return await _query._connection.QueryAsync <T>(sql, _query._sqlBuilder.Parameters, _query._transaction);
                    })).FirstOrDefault());
                }
                else
                {
                    _query._sqlBuilder.Selector(_query._documentTable, "*");
                    var sql       = _query._sqlBuilder.ToSqlString();
                    var key       = new WorkerQueryKey(sql, _query._sqlBuilder.Parameters);
                    var documents = (await _query._session._store.ProduceAsync(key, async() =>
                    {
                        return(await _query._connection.QueryAsync <Document>(sql, _query._sqlBuilder.Parameters, _query._transaction));
                    })).ToArray();

                    if (documents.Length == 0)
                    {
                        return(default(T));
                    }

                    return(_query._session.Get <T>(documents).FirstOrDefault());
                }
            }
コード例 #3
0
            protected async Task <T> FirstOrDefaultImpl()
            {
                // Flush any pending changes before doing a query (auto-flush)
                await _query._session.FlushAsync();

                var transaction = await _query._session.DemandAsync();

                if (_query._compiledQuery != null && _query._queryState._parameterBindings != null)
                {
                    foreach (var binding in _query._queryState._parameterBindings)
                    {
                        binding(_query._compiledQuery, _query._queryState._sqlBuilder);
                    }
                }

                _query.Page(1, 0);

                if (typeof(IIndex).IsAssignableFrom(typeof(T)))
                {
                    _query._queryState._sqlBuilder.Selector("*");
                    var sql = _query._queryState._sqlBuilder.ToSqlString();
                    var key = new WorkerQueryKey(sql, _query._queryState._sqlBuilder.Parameters);
                    return((await _query._session._store.ProduceAsync(key, () =>
                    {
                        _query._session._store.Configuration.Logger.LogDebug(sql);
                        return transaction.Connection.QueryAsync <T>(sql, _query._queryState._sqlBuilder.Parameters, transaction);
                    })).FirstOrDefault());
                }
                else
                {
                    _query._queryState._sqlBuilder.Selector(_query._queryState._documentTable, "*");
                    var sql       = _query._queryState._sqlBuilder.ToSqlString();
                    var key       = new WorkerQueryKey(sql, _query._queryState._sqlBuilder.Parameters);
                    var documents = (await _query._session._store.ProduceAsync(key, () =>
                    {
                        _query._session._store.Configuration.Logger.LogDebug(sql);
                        return(transaction.Connection.QueryAsync <Document>(sql, _query._queryState._sqlBuilder.Parameters, transaction));
                    })).ToArray();

                    if (documents.Length == 0)
                    {
                        return(default(T));
                    }

                    return(_query._session.Get <T>(documents).FirstOrDefault());
                }
            }