static public string Run(string[] args)
        {
            StringBuilder sb      = new StringBuilder();
            Storage       storage = StorageFactory.Instance.CreateStorage();

            storage.Open("testlinq.dbs");
            QueryListener listener = new QueryListener();

            storage.Listener = listener;
            Database db = new Database(storage);
            int      n;

            Customer customer1 = new Customer();

            customer1.name          = "Age Soft";
            customer1.address       = "MT, Freen Valley, 5";
            customer1.phone         = "111-1111";
            customer1.contactPerson = "John Smith";
            customer1.vip           = true;
            db.AddRecord(customer1);

            Customer customer2 = new Customer();

            customer2.name          = "WebAlta";
            customer2.address       = "Moscow, Russia, Kolomenskay nab.,2";
            customer2.phone         = "222-22222";
            customer2.contactPerson = "Piter Volokov";
            db.AddRecord(customer2);


            BugReport bug1 = new BugReport();

            bug1.issuedBy    = customer1;
            bug1.priority    = BugReport.Priority.Low;
            bug1.description = "It doesn't work";
            bug1.version     = 1.03M;
            db.AddRecord(bug1);

            BugReport bug2 = new BugReport();

            bug2.issuedBy    = customer2;
            bug2.priority    = BugReport.Priority.High;
            bug2.description = "Something is definitely wrong";
            bug2.version     = 2.01M;
            db.AddRecord(bug2);

            sb.AppendLine("Search customer by name");
            n = 0;
            foreach (Customer c in db.Select <Customer>(c => c.name == "WebAlta"))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            sb.AppendLine("Locate customers issued high priority bugs for version 2.0");
            n = 0;
            var query1 = from bug in db.GetTable <BugReport>()
                         where bug.priority >= BugReport.Priority.High && bug.version >= 2.0M
                         orderby bug.priority
                         select bug.issuedBy;

            foreach (var c in query1)
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            sb.AppendLine("Select customer by name and contact person");
            n = 0;
            string name   = "Age Soft";
            string person = "John Smith";
            var    query2 = from c in db.GetTable <Customer>()
                            where name == c.name && c.contactPerson == person
                            select c;

            foreach (var c in query2)
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            name   = "WebAlta";
            person = "Piter Volokov";
            n      = 0;
            foreach (var c in query2)
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);
            Debug.Assert(listener.nSeqSearches == 0);

            sb.AppendLine("Select with index join");
            n = 0;
            foreach (BugReport bug in db.Select <BugReport>(bug => bug.issuedBy.name == "WebAlta" || bug.issuedBy.name == "Age Soft"))
            {
                sb.AppendLine(bug.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            sb.AppendLine("Select with index prefix search");
            n = 0;
            foreach (Customer customer in db.Select <Customer>(customer => customer.phone == "222-22222" && customer.name.StartsWith("Web")))
            {
                sb.AppendLine(customer.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            Debug.Assert(listener.nSeqSearches == 0);


            sb.AppendLine("Select without search condition");
            n = 0;
            var query3 = from bug in db.GetTable <BugReport>()
                         orderby bug.priority
                         select bug;

            foreach (var b in query3)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            sb.AppendLine("Select using sequential search");
            n = 0;
            var query4 = from bug in db.GetTable <BugReport>()
                         where bug.version >= 2.0M
                         select bug;

            foreach (var b in query4)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            var query5 = from bug in db.GetTable <BugReport>()
                         where bug.issuedBy == customer1
                         select bug;

            foreach (var b in query5)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            List <Customer> customers = new List <Customer>();

            customers.Add(customer1);
            customers.Add(customer2);
            var query6 = from bug in db.GetTable <BugReport>()
                         where customers.Contains(bug.issuedBy)
                         select bug;

            foreach (var b in query6)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            n = 0;
            foreach (Customer c in db.Select <Customer>(c => c.name.CompareTo("A") >= 0))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            n = 0;
            foreach (Customer c in db.Select <Customer>(c => String.Compare(c.name, "webalta", StringComparison.CurrentCultureIgnoreCase) == 0))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            foreach (Customer c in db.Select <Customer>(c => c.vip))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            foreach (Customer c in db.Select <Customer>(c => !c.vip))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);


            Debug.Assert(listener.nSeqSearches == 1);

            storage.Close();
            return(sb.ToString());
        }
        static public string Run(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            Storage storage = StorageFactory.Instance.CreateStorage();
            storage.Open("testlinq.dbs");
            QueryListener listener = new QueryListener();
            storage.Listener = listener;
            Database db = new Database(storage);
            int n;

            Customer customer1 = new Customer();
            customer1.name = "Age Soft";
            customer1.address = "MT, Freen Valley, 5";
            customer1.phone = "111-1111";
            customer1.contactPerson = "John Smith";
            customer1.vip = true;
            db.AddRecord(customer1);

            Customer customer2 = new Customer();
            customer2.name = "WebAlta";
            customer2.address = "Moscow, Russia, Kolomenskay nab.,2";
            customer2.phone = "222-22222";
            customer2.contactPerson = "Piter Volokov";
            db.AddRecord(customer2);


            BugReport bug1 = new BugReport();
            bug1.issuedBy = customer1;
            bug1.priority = BugReport.Priority.Low;
            bug1.description = "It doesn't work";
            bug1.version = 1.03M;
            db.AddRecord(bug1);

            BugReport bug2 = new BugReport();
            bug2.issuedBy = customer2;
            bug2.priority = BugReport.Priority.High;
            bug2.description = "Something is definitely wrong";
            bug2.version = 2.01M;
            db.AddRecord(bug2);

            sb.AppendLine("Search customer by name");
            n = 0;
            foreach (Customer c in db.Select<Customer>(c => c.name == "WebAlta"))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            sb.AppendLine("Locate customers issued high priority bugs for version 2.0");
            n = 0;
            var query1 = from bug in db.GetTable<BugReport>()
                         where bug.priority >= BugReport.Priority.High && bug.version >= 2.0M
                         orderby bug.priority
                         select bug.issuedBy;
            foreach (var c in query1)
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            sb.AppendLine("Select customer by name and contact person");
            n = 0;
            string name = "Age Soft";
            string person = "John Smith";
            var query2 = from c in db.GetTable<Customer>()
                         where name == c.name && c.contactPerson == person
                         select c;
            foreach (var c in query2)
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            name = "WebAlta";
            person = "Piter Volokov";
            n = 0;
            foreach (var c in query2)
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);
            Debug.Assert(listener.nSeqSearches == 0);

            sb.AppendLine("Select with index join");
            n = 0;
            foreach (BugReport bug in db.Select<BugReport>(bug => bug.issuedBy.name == "WebAlta" || bug.issuedBy.name == "Age Soft"))
            {
                sb.AppendLine(bug.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            sb.AppendLine("Select with index prefix search");
            n = 0;
            foreach (Customer customer in db.Select<Customer>(customer => customer.phone == "222-22222" && customer.name.StartsWith("Web")))
            {
                sb.AppendLine(customer.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            Debug.Assert(listener.nSeqSearches == 0);


            sb.AppendLine("Select without search condition");
            n = 0;
            var query3 = from bug in db.GetTable<BugReport>()
                         orderby bug.priority
                         select bug;
            foreach (var b in query3)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            sb.AppendLine("Select using sequential search");
            n = 0;
            var query4 = from bug in db.GetTable<BugReport>()
                         where bug.version >= 2.0M
                         select bug;
            foreach (var b in query4)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            var query5 = from bug in db.GetTable<BugReport>()
                         where bug.issuedBy == customer1
                         select bug;
            foreach (var b in query5)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            List<Customer> customers = new List<Customer>();
            customers.Add(customer1);
            customers.Add(customer2);
            var query6 = from bug in db.GetTable<BugReport>()
                         where customers.Contains(bug.issuedBy)
                         select bug;
            foreach (var b in query6)
            {
                sb.AppendLine(b.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            n = 0;
            foreach (Customer c in db.Select<Customer>(c => c.name.CompareTo("A") >= 0))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 2);

            n = 0;
            foreach (Customer c in db.Select<Customer>(c => String.Compare(c.name, "webalta", StringComparison.CurrentCultureIgnoreCase) == 0))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            foreach (Customer c in db.Select<Customer>(c => c.vip))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);

            n = 0;
            foreach (Customer c in db.Select<Customer>(c => !c.vip))
            {
                sb.AppendLine(c.ToString());
                n += 1;
            }
            Debug.Assert(n == 1);


            Debug.Assert(listener.nSeqSearches == 1);

            storage.Close();
            return sb.ToString();
        }