public async Task QueryDictionaryTest(bool predicate)
        {
            var testData = new Tuple <int, string>[]
            {
                new Tuple <int, string>(1, "v1"),
                new Tuple <int, string>(2, "v2"),
                new Tuple <int, string>(3, "v3"),
            };

            var query = SqQueryBuilder.SelectOne();

            TestSqDatabase database = new TestSqDatabase(BuildQueryDelegate(query: query, testData: testData));


            Func <int, string, bool>?p = null;

            if (predicate)
            {
                p = (k, v) => k != 3 && v != "v3";
            }

            var result = await query.QueryDictionary(database, r => r.GetInt32("K"), r => r.GetString("V"), predicate : p);

            var count = predicate ? 2 : 3;

            Assert.AreEqual(count, result.Count);
            for (int i = 0; i < count; i++)
            {
                Assert.AreEqual(testData[i].Item2, result[testData[i].Item1]);
            }
        }
        public async Task QueryDictionaryTest_KeyDuplication()
        {
            var testData = new Tuple <int, string>[]
            {
                new Tuple <int, string>(1, "v1"),
                new Tuple <int, string>(2, "v2"),
                new Tuple <int, string>(2, "v3"),
            };

            var query = SqQueryBuilder.SelectOne();

            TestSqDatabase database = new TestSqDatabase(queryImplementation: BuildQueryDelegate(query, testData));


            var result = await query.QueryDictionary(database, r => r.GetInt32("K"), r => r.GetString("V"), KeyDuplicationHandler);

            var count = 3;

            Assert.AreEqual(count, result.Count);
            for (int i = 0; i < count; i++)
            {
                var item1 = testData[i].Item2 == "v3" ? 3 : testData[i].Item1;
                Assert.AreEqual(testData[i].Item2, result[item1]);
            }