New tests.
[mono.git] / mcs / class / System.Data.Linq / src / DbLinq / Test / Providers / ReadTest.cs
index 0e7a8cd816a1094ac1daa4b1b8015d849fce8218..1f443c32ac66030d295c8a83b74bbbef11f0b92b 100644 (file)
@@ -39,6 +39,22 @@ using DataLinq = System.Data.Linq;
 using DataLinq = DbLinq.Data.Linq;\r
 #endif\r
 \r
+namespace nwind\r
+{\r
+    interface IHasAddress\r
+    {\r
+        string Address { get; set; }\r
+    }\r
+\r
+    partial class Customer : IHasAddress\r
+    {\r
+    }\r
+\r
+    partial class Employee : IHasAddress\r
+    {\r
+    }\r
+}\r
+\r
 // test ns \r
 #if MYSQL\r
     namespace Test_NUnit_MySql\r
@@ -52,7 +68,7 @@ using DataLinq = DbLinq.Data.Linq;
     namespace Test_NUnit_Sqlite\r
 #elif INGRES\r
     namespace Test_NUnit_Ingres\r
-#elif MSSQL && MONO_STRICT\r
+#elif MSSQL && L2SQL\r
     namespace Test_NUnit_MsSql_Strict\r
 #elif MSSQL\r
     namespace Test_NUnit_MsSql\r
@@ -81,15 +97,19 @@ using DataLinq = DbLinq.Data.Linq;
 \r
 \r
 \r
+#if !DEBUG && (MSSQL && L2SQL)\r
+        // L2SQL doesn't support 'SELECT' queries in DataContext.ExecuteCommand().\r
+        [Explicit]\r
+#endif\r
         [Test]\r
         public void A3_ProductsTableHasPen()\r
         {\r
             Northwind db = CreateDB();\r
-            //string sql = @"SELECT count(*) FROM linqtestdb.Products WHERE ProductName='Pen'";\r
-            string sql = @"SELECT count(*) FROM [Products] WHERE [ProductName]='Pen'";\r
+            //string sql = @"SELECT count(*) FROM linqtestdb.Products WHERE ProductName='Chai'";\r
+            string sql = @"SELECT count(*) FROM [Products] WHERE [ProductName]='Chai'";\r
             long iResult = db.ExecuteCommand(sql);\r
             //long iResult = base.ExecuteScalar(sql);\r
-            Assert.AreEqual(iResult, 1L, "Expecting one Pen in Products table, got:" + iResult + " (SQL:" + sql + ")");\r
+            Assert.AreEqual(iResult, 1L, "Expecting one Chai in Products table, got:" + iResult + " (SQL:" + sql + ")");\r
         }\r
 \r
         [Test]\r
@@ -98,8 +118,14 @@ using DataLinq = DbLinq.Data.Linq;
             Northwind db = CreateDB();\r
 \r
             // Query for a specific customer\r
-            var cust = db.Customers.Single(c => c.CompanyName == "airbus");\r
-            Assert.IsNotNull(cust, "Expected one customer 'airbus'");\r
+            var cust = db.Customers.Single(c => c.CompanyName == "Around the Horn");\r
+            Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");\r
+            var id = 1;\r
+            var prod = db.Products.Single(p => p.ProductID == id);\r
+            Assert.AreEqual("Chai", prod.ProductName);\r
+            id = 2;\r
+            prod = db.Products.Single(p => p.ProductID == id);\r
+            Assert.AreEqual("Chang", prod.ProductName);\r
         }\r
 \r
         [Test]\r
@@ -108,8 +134,46 @@ using DataLinq = DbLinq.Data.Linq;
             Northwind db = CreateDB();\r
 \r
             // Query for a specific customer\r
-            var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "airbus");\r
-            Assert.IsNotNull(cust, "Expected one customer 'airbus'");\r
+            var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");\r
+            Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");\r
+\r
+#if false\r
+            var id = "ALFKI";\r
+            cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);\r
+            Assert.AreEqual("ALFKI", cust.CustomerID);\r
+            id = "BLAUS";\r
+            cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);\r
+            Assert.AreEqual("BLAUS", cust.CustomerID);\r
+            id = "DNE";\r
+            cust = db.Customers.SingleOrDefault(c => c.CustomerID == id); // Does Not Exist\r
+            Assert.IsNull(cust);\r
+\r
+            id = "ALFKI";\r
+            cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);\r
+            Assert.AreEqual("ALFKI", cust.CustomerID);\r
+            id = "BLAUS";\r
+            cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);\r
+#endif\r
+            cust = GetCustomerById(db, "ALFKI");\r
+            Assert.AreEqual("ALFKI", cust.CustomerID);\r
+\r
+            cust = GetCustomerById(db, "BLAUS");\r
+            Assert.AreEqual("BLAUS", cust.CustomerID);\r
+\r
+            cust = GetCustomerById(db, "DNE");\r
+            Assert.IsNull(cust);\r
+\r
+            cust = GetCustomerById(db, "ALFKI");\r
+            Assert.AreEqual("ALFKI", cust.CustomerID);\r
+\r
+            cust = GetCustomerById(db, "BLAUS");\r
+            Assert.AreEqual("BLAUS", cust.CustomerID);\r
+        }\r
+\r
+\r
+        private static Customer GetCustomerById(Northwind db, string id)\r
+        {\r
+            return db.Customers.SingleOrDefault(c => c.CustomerID == id);\r
         }\r
 \r
 \r
@@ -129,6 +193,34 @@ using DataLinq = DbLinq.Data.Linq;
             Assert.IsTrue(p1.ProductID == 1);\r
         }\r
 \r
+        [Test]\r
+        public void A8_SelectSingleOrDefault_QueryCacheDisabled()\r
+        {\r
+            Northwind db = CreateDB();\r
+#if !MONO_STRICT\r
+            db.QueryCacheEnabled = true;\r
+#endif\r
+\r
+            // Query for a specific customer\r
+            var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");\r
+            Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");\r
+\r
+            cust = GetCustomerById(db, "ALFKI");\r
+            Assert.AreEqual("ALFKI", cust.CustomerID);\r
+\r
+            cust = GetCustomerById(db, "BLAUS");\r
+            Assert.AreEqual("BLAUS", cust.CustomerID);\r
+\r
+            cust = GetCustomerById(db, "DNE");\r
+            Assert.IsNull(cust);\r
+\r
+            cust = GetCustomerById(db, "ALFKI");\r
+            Assert.AreEqual("ALFKI", cust.CustomerID);\r
+\r
+            cust = GetCustomerById(db, "BLAUS");\r
+            Assert.AreEqual("BLAUS", cust.CustomerID);\r
+        }\r
+\r
         #endregion\r
 \r
         //TODO: group B, which checks AllTypes\r
@@ -145,12 +237,15 @@ using DataLinq = DbLinq.Data.Linq;
             Assert.Greater(productCount, 0, "Expected some products, got none");\r
         }\r
 \r
+#if !DEBUG && SQLITE\r
+        [Explicit]\r
+#endif\r
         [Test]\r
         public void C2_SelectPenId()\r
         {\r
             Northwind db = CreateDB();\r
 \r
-            var q = from p in db.Products where p.ProductName == "Pen" select p.ProductID;\r
+            var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;\r
             var productIDs = q.ToList();\r
             int productCount = productIDs.Count;\r
             Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);\r
@@ -161,7 +256,7 @@ using DataLinq = DbLinq.Data.Linq;
         {\r
             Northwind db = CreateDB();\r
 \r
-            var pen = "Pen";\r
+            var pen = "Chai";\r
             var q = from p in db.Products where p.ProductName == pen select p.ProductID;\r
             var productIDs = q.ToList();\r
             int productCount = productIDs.Count;\r
@@ -174,18 +269,21 @@ using DataLinq = DbLinq.Data.Linq;
             Northwind db = CreateDB();\r
 \r
             var q = from p in db.Products\r
-                    where p.ProductName == "Pen"\r
+                    where p.ProductName == "Chai"\r
                     select new { ProductId = p.ProductID, Name = p.ProductName };\r
             int count = 0;\r
             //string penName;\r
             foreach (var v in q)\r
             {\r
-                Assert.AreEqual(v.Name, "Pen", "Expected ProductName='Pen'");\r
+                Assert.AreEqual(v.Name, "Chai", "Expected ProductName='Chai'");\r
                 count++;\r
             }\r
             Assert.AreEqual(count, 1, "Expected one pen, got count=" + count);\r
         }\r
 \r
+#if !DEBUG && POSTGRES\r
+        [Explicit]\r
+#endif\r
         [Test]\r
         public void C4_CountWithOrderBy()\r
         {\r
@@ -203,7 +301,7 @@ using DataLinq = DbLinq.Data.Linq;
             var res = from o in db.Orders\r
                       select new { test = 1 };\r
             var list = res.ToList();\r
-            Assert.IsTrue(list.Count > 0);\r
+            Assert.AreEqual(db.Orders.Count(), list.Count);\r
         }\r
 \r
 \r
@@ -244,6 +342,9 @@ using DataLinq = DbLinq.Data.Linq;
         /// <summary>\r
         /// from http://www.agilior.pt/blogs/pedro.rainho/archive/2008/04/11/4271.aspx\r
         /// </summary>\r
+#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))\r
+        [Explicit]\r
+#endif\r
         [Test(Description = "Using LIKE operator from linq query")]\r
         public void C7B_LikeOperator()\r
         {\r
@@ -262,7 +363,7 @@ using DataLinq = DbLinq.Data.Linq;
         public void C8_SelectPenByLocalVariable()\r
         {\r
             Northwind db = CreateDB();\r
-            string pen = "Pen";\r
+            string pen = "Chai";\r
 \r
             var q = from p in db.Products\r
                     where (p.ProductName == pen)\r
@@ -293,8 +394,68 @@ using DataLinq = DbLinq.Data.Linq;
                     where true\r
                     select p;\r
 \r
-            int count = q.ToList().Count();\r
-            Assert.Greater(count,0);\r
+            int count = q.ToList().Count;\r
+            Assert.AreEqual(count, db.Customers.Count());\r
+        }\r
+\r
+        [Test]\r
+        public void C10b_ConstantPredicate()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from p in db.Customers\r
+                    where false\r
+                    select p;\r
+\r
+            int count = q.Count();\r
+            Assert.AreEqual(count, 0);\r
+        }\r
+\r
+        [Test]\r
+        public void C10c_ConstantPredicate()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from p in db.Customers\r
+                    where (p.Address.StartsWith("A") && false)\r
+                    select p;\r
+\r
+            int count = q.Count();\r
+            Assert.AreEqual(count, 0);\r
+        }\r
+\r
+        [Test]\r
+        public void C10d_ConstantPredicate()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from p in db.Customers\r
+                    where (p.Address.StartsWith("A") || true)\r
+                    select p;\r
+\r
+            int count = q.Count();\r
+            Assert.AreEqual(count, db.Customers.Count());\r
+        }\r
+\r
+        [Test]\r
+        public void C10e_ConstantPredicate()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from p in db.Customers\r
+                    where (p.Address.StartsWith("A") || false)\r
+                    select p;\r
+\r
+            int count = q.Count();\r
+            Assert.Less(count, db.Customers.Count());\r
+        }\r
+\r
+        [Test]\r
+        public void C10f_ConstantPredicate()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from p in db.Customers\r
+                    where (p.Address.StartsWith("A") && true)\r
+                    select p;\r
+\r
+            int count = q.Count();\r
+            Assert.Less(count, db.Customers.Count());\r
         }\r
 \r
         [Test]\r
@@ -303,7 +464,7 @@ using DataLinq = DbLinq.Data.Linq;
             Northwind db = CreateDB();\r
             var q = from p in db.Products \r
 #if INGRES\r
-                    where p.Discontinued != 0\r
+                    where p.Discontinued == "Y"\r
 #else\r
                     where p.Discontinued == true \r
 #endif\r
@@ -314,6 +475,7 @@ using DataLinq = DbLinq.Data.Linq;
             Assert.AreEqual(productCount, 8, "Expected eight products discontinued, got count=" + productCount);\r
         }\r
 \r
+        [Explicit]\r
         [Test]\r
         public void C12_SelectEmployee_MultiJoinWithWhere()\r
         {\r
@@ -333,6 +495,340 @@ using DataLinq = DbLinq.Data.Linq;
             Assert.AreEqual(4, employeeCount, "Expected for employees, got count=" + employeeCount);\r
         }\r
 \r
+        [Test]\r
+        [ExpectedException(ExceptionType=typeof(InvalidOperationException), ExpectedMessage="Data context options cannot be modified after results have been returned from a query.")]\r
+        public void C13_Changing_ObjectTrackingEnabled2False()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from t in db.Territories\r
+                    select t;\r
+            var territoryCount = q.FirstOrDefault();\r
+            db.ObjectTrackingEnabled = false;\r
+        }\r
+\r
+        [Test]\r
+        [ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Data context options cannot be modified after results have been returned from a query.")]\r
+        public void C14_Changing_DeferredLoadingEnabled2False()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from t in db.Territories\r
+                    select t;\r
+            var territoryCount = q.FirstOrDefault();\r
+            db.DeferredLoadingEnabled = false;\r
+        }\r
+\r
+        [Test]\r
+        [ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Object tracking is not enabled for the current data context instance.")]\r
+        public void C15_SubmitChanges_DeferredLoadingEnabled_False()\r
+        {\r
+            Northwind db = CreateDB();\r
+            db.ObjectTrackingEnabled = false;\r
+            var q = from t in db.Territories\r
+                    select t;\r
+            var territoryCount = q.Count();\r
+            db.SubmitChanges();\r
+        }\r
+\r
+        [Test]\r
+        public void C16_GettingProperty_DeferredLoadingEnabled2False()\r
+        {\r
+            Northwind db = CreateDB();\r
+            db.DeferredLoadingEnabled = false;\r
+            var q = from t in db.Territories\r
+                    select t;\r
+            Territory territory = q.FirstOrDefault();\r
+            Assert.IsNotNull(territory);\r
+            Assert.IsNull(territory.Region);\r
+        }\r
+\r
+        [Test]\r
+        public void C17_GettingProperty_ObjectTrackingEnabled2False()\r
+        {\r
+            Northwind db = CreateDB();\r
+            db.ObjectTrackingEnabled = false;\r
+            var q = from t in db.Territories\r
+                    select t;\r
+            Territory territory = q.FirstOrDefault();\r
+            Assert.IsNotNull(territory);\r
+            Assert.IsNull(territory.Region);\r
+        }\r
+\r
+        [Test]\r
+        public void C18_GettingProperty_LazyLoaded()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = from t in db.Territories\r
+                    select t;\r
+            Territory territory = q.FirstOrDefault();\r
+            Assert.IsNotNull(territory);\r
+            Assert.IsNotNull(territory.Region);\r
+        }\r
+\r
+        [Test]\r
+        public void C19_SelectEmployee_Fluent()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var q = db.GetTable<Territory>()\r
+                        .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)\r
+                        .Join(db.GetTable<Employee>().Where(e => e.EmployeeID > 0), l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);\r
+            var employeeCount = q.Count();\r
+            Assert.Greater(employeeCount, 0, "Expected any employees, got count=" + employeeCount);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Test the use of DbLinq as a QueryObject\r
+        /// http://www.martinfowler.com/eaaCatalog/queryObject.html\r
+        /// </summary>\r
+        [Test]\r
+        public void C20_SelectEmployee_DbLinqAsQueryObject()\r
+        {\r
+            Northwind db = CreateDB();\r
+            IQueryable<Employee> allEmployees = db.GetTable<Employee>();\r
+\r
+            allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");\r
+\r
+            allEmployees = filterByTerritoryName(db, allEmployees, "Neward");\r
+\r
+            Assert.AreEqual(1, allEmployees.Count());\r
+        }\r
+\r
+        [Test]\r
+        public void C21_SelectEmployee_DbLinqAsQueryObjectWithOrderCount()\r
+        {\r
+            Northwind db = CreateDB();\r
+            IQueryable<Employee> allEmployees = db.GetTable<Employee>();\r
+\r
+            allEmployees = filterByOrderCountGreaterThan(db, allEmployees, 50);\r
+            allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");\r
+\r
+            allEmployees = filterByTerritoryNames(db, allEmployees, "Neward", "Boston", "Wilton");\r
+\r
+            int employeesCount = allEmployees.ToList().Count;\r
+\r
+            Assert.AreEqual(employeesCount, allEmployees.Count());\r
+        }\r
+\r
+\r
+        private IQueryable<Employee> filterByOrderCountGreaterThan(Northwind db, IQueryable<Employee> allEmployees, int minimumOrderNumber)\r
+        {\r
+            return from e in allEmployees.Where(e => e.Orders.Count > minimumOrderNumber) select e;\r
+        }\r
+\r
+        private IQueryable<Employee> filterByNameOrSurnameContains(Northwind db, IQueryable<Employee> allEmployees, string namePart)\r
+        {\r
+            return from e in allEmployees.Where(e => e.FirstName.Contains(namePart) || e.LastName.Contains(namePart)) select e;\r
+        }\r
+\r
+        private IQueryable<Employee> filterByTerritoryName(Northwind db, IQueryable<Employee> allEmployees, string territoryName)\r
+        {\r
+            IQueryable<Territory> territoryRequired = db.GetTable<Territory>().Where(t => t.TerritoryDescription == territoryName);\r
+            var q = territoryRequired\r
+                        .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)\r
+                        .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);\r
+            return q;\r
+        }\r
+\r
+        private IQueryable<Employee> filterByTerritoryNames(Northwind db, IQueryable<Employee> allEmployees, params string[] territoryNames)\r
+        {\r
+            IQueryable<Territory> territoryRequired = db.GetTable<Territory>().Where(t => territoryNames.Contains(t.TerritoryDescription));\r
+            var q = territoryRequired\r
+                        .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)\r
+                        .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);\r
+            return q;\r
+        }\r
+\r
+        [Test]\r
+        public void C22_SelectEmployee_GetCommandTextWithNoFilter()\r
+        {\r
+            Northwind db = CreateDB();\r
+            IQueryable<Employee> allEmployees = db.GetTable<Employee>();\r
+            var commandText = db.GetCommand(allEmployees).CommandText;\r
+            Assert.IsNotNull(commandText);\r
+        }\r
+\r
+        [Test]\r
+        public void C23_SelectEmployees()\r
+        {\r
+            Northwind db = CreateDB();\r
+            var allEmployees = db.GetTable<Employee>();\r
+            int count = 0;\r
+            foreach (var emp in allEmployees)\r
+            {\r
+                ++count;\r
+            }\r
+            Assert.AreEqual(9, count);\r
+        }\r
+\r
+#if !DEBUG && (MSSQL && !L2SQL)\r
+        [Explicit]\r
+#endif\r
+        [Test]\r
+        public void C24_SelectEmployee_DbLinqAsQueryObjectWithExceptAndImage()\r
+        {\r
+            // This fail becouse Employee contains a ndata, ndata is not comparable\r
+            // and EXCEPT make a distinct on DATA\r
+            Northwind db = CreateDB();\r
+            IQueryable<Employee> allEmployees = db.GetTable<Employee>();\r
+\r
+            var toExclude = filterByOrderCountGreaterThan(db, allEmployees, 50);\r
+            allEmployees = filterByNameOrSurnameContains(db, allEmployees, "a").Except(toExclude);\r
+\r
+            string commandText = db.GetCommand(allEmployees).CommandText;\r
+\r
+            int employeesCount = allEmployees.ToList().Count;\r
+\r
+            Assert.AreEqual(employeesCount, allEmployees.Count());\r
+        }\r
+\r
+        [Test]\r
+        public void C25_SelectViaInterface()\r
+        {\r
+            var db = CreateDB();\r
+            var c = MatchAddress(db.Customers, "ignoreme").FirstOrDefault();\r
+            Assert.IsNotNull(c);\r
+            var e = MatchAddress(db.Employees, "ignoreme").FirstOrDefault();\r
+            Assert.IsNotNull(e);\r
+        }\r
+\r
+        private static IEnumerable<T> MatchAddress<T>(IQueryable<T> query, string searchValue)\r
+            where T : IHasAddress\r
+        {\r
+            var lookups = query.OrderByDescending(v => v.Address.Length);\r
+            return lookups;\r
+        }\r
+\r
+#if !DEBUG && POSTGRES\r
+        [Explicit]\r
+#endif\r
+        [Test]\r
+        public void C26_SelectWithNestedMethodCall()\r
+        {\r
+            var db = CreateDB();\r
+            var s = "param";\r
+            var q = from e in db.Employees select new\r
+            {\r
+                BackName    = e.LastName + ", " + e.FirstName,\r
+                StaticName  = GetStaticName(e),\r
+                InstanceName= GetInstanceName(e, s, "constant"),\r
+                Territories = e.EmployeeTerritories.ToList(),\r
+            };\r
+            var actual  = q.ToList();\r
+            var expected = new[]{\r
+                new {\r
+                    BackName        = "Davolio, Nancy",\r
+                    StaticName      = "Nancy Davolio [Hired: 1992-05-01]",\r
+                    InstanceName    = "Nancy Davolio [Home Phone: (206) 555-9857]",\r
+                    TerritoryCount  = 2,\r
+                },\r
+                new {\r
+                    BackName        = "Fuller, Andrew",\r
+                    StaticName      = "Andrew Fuller [Hired: 1992-08-14]",\r
+                    InstanceName    = "Andrew Fuller [Home Phone: (206) 555-9482]",\r
+                    TerritoryCount  = 7,\r
+                },\r
+                new {\r
+                    BackName        = "Leverling, Janet",\r
+                    StaticName      = "Janet Leverling [Hired: 1992-04-01]",\r
+                    InstanceName    = "Janet Leverling [Home Phone: (206) 555-3412]",\r
+                    TerritoryCount  = 4,\r
+                },\r
+                new {\r
+                    BackName        = "Peacock, Margaret",\r
+                    StaticName      = "Margaret Peacock [Hired: 1993-05-03]",\r
+                    InstanceName    = "Margaret Peacock [Home Phone: (206) 555-8122]",\r
+                    TerritoryCount  = 3,\r
+                },\r
+                new {\r
+                    BackName        = "Buchanan, Steven",\r
+                    StaticName      = "Steven Buchanan [Hired: 1993-10-17]",\r
+                    InstanceName    = "Steven Buchanan [Home Phone: (71) 555-4848]",\r
+                    TerritoryCount  = 7,\r
+                },\r
+                new {\r
+                    BackName        = "Suyama, Michael",\r
+                    StaticName      = "Michael Suyama [Hired: 1993-10-17]",\r
+                    InstanceName    = "Michael Suyama [Home Phone: (71) 555-7773]",\r
+                    TerritoryCount  = 5,\r
+                },\r
+                new {\r
+                    BackName        = "King, Robert",\r
+                    StaticName      = "Robert King [Hired: 1994-01-02]",\r
+                    InstanceName    = "Robert King [Home Phone: (71) 555-5598]",\r
+                    TerritoryCount  = 10,\r
+                },\r
+                new {\r
+                    BackName        = "Callahan, Laura",\r
+                    StaticName      = "Laura Callahan [Hired: 1994-03-05]",\r
+                    InstanceName    = "Laura Callahan [Home Phone: (206) 555-1189]",\r
+                    TerritoryCount  = 4,\r
+                },\r
+                new {\r
+                    BackName        = "Dodsworth, Anne",\r
+                    StaticName      = "Anne Dodsworth [Hired: 1994-11-15]",\r
+                    InstanceName    = "Anne Dodsworth [Home Phone: (71) 555-4444]",\r
+                    TerritoryCount  = 7,\r
+                },\r
+            };\r
+            Assert.AreEqual(expected.Length, actual.Count);\r
+            for (int i = 0; i < expected.Length; ++i)\r
+            {\r
+                Assert.AreEqual(expected[i].BackName, actual[i].BackName);\r
+                Assert.AreEqual(expected[i].StaticName, actual[i].StaticName);\r
+                Assert.AreEqual(expected[i].InstanceName, actual[i].InstanceName);\r
+                Assert.AreEqual(expected[i].TerritoryCount, actual[i].Territories.Count);\r
+            }\r
+        }\r
+\r
+        static string GetStaticName(Employee e)\r
+        {\r
+            return e.FirstName + " " + e.LastName + " [Hired: " + \r
+                (e.HireDate.HasValue ? e.HireDate.Value.ToString("yyyy-MM-dd") : "") + "]";\r
+        }\r
+\r
+        string GetInstanceName(Employee e, string a, string b)\r
+        {\r
+            return e.FirstName + " " + e.LastName + " [Home Phone: " + e.HomePhone.ToString() + "]";\r
+        }\r
+\r
+        [Test]\r
+        public void C27_SelectEntitySet()\r
+        {\r
+            // Debugger.Break();\r
+            var db = CreateDB();\r
+            var q = from e in db.Employees\r
+                    orderby e.EmployeeID\r
+                    select new\r
+                    {\r
+                        e.Orders\r
+                    };\r
+            var expectedOrderCounts = new[]{\r
+                123,    // Nancy Davolio\r
+                 96,    // Andrew Fuller\r
+                127,    // Janet Leverling\r
+                156,    // Margaret Peacock\r
+                 42,    // Steven Buchanan\r
+                 67,    // Michael Suyama\r
+                 72,    // Robert King\r
+                104,    // Laura Callahan\r
+                 43,    // Anne Dodsworth\r
+            };\r
+            int c = 0;\r
+            foreach (var e in q)\r
+            {\r
+                Assert.AreEqual(expectedOrderCounts[c], e.Orders.Count);\r
+                ++c;\r
+            }\r
+            Assert.AreEqual(expectedOrderCounts.Length, c);\r
+        }\r
+\r
+        [Test]\r
+        public void C28_SelectEntityRef()\r
+        {\r
+            var db = CreateDB();\r
+            var emp = db.Employees.Single(e => e.EmployeeID == 1);\r
+            Assert.IsNotNull(emp.ReportsToEmployee);\r
+            Assert.AreEqual(emp.ReportsTo.Value, emp.ReportsToEmployee.EmployeeID);\r
+        }\r
         #endregion\r
 \r
         #region region D - select first or last - calls IQueryable.Execute instead of GetEnumerator\r
@@ -341,7 +837,7 @@ using DataLinq = DbLinq.Data.Linq;
         {\r
             Northwind db = CreateDB();\r
 \r
-            var q = from p in db.Products where p.ProductName == "Pen" select p.ProductID;\r
+            var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;\r
             var productID = q.First();\r
             Assert.Greater(productID, 0, "Expected penID>0, got " + productID);\r
         }\r
@@ -368,21 +864,28 @@ using DataLinq = DbLinq.Data.Linq;
         {\r
             Northwind db = CreateDB();\r
 \r
-            var q = from p in db.Products where p.ProductName == "Pen" select p;\r
+            var q = from p in db.Products where p.ProductName == "Chai" select p;\r
             Product pen = q.First();\r
             Assert.IsNotNull(pen, "Expected non-null Product");\r
         }\r
 \r
+#if !DEBUG && MSSQL\r
+        // L2SQL: System.NotSupportedException : The query operator 'Last' is not supported.\r
+        [Explicit]\r
+#endif\r
         [Test]\r
         public void D03_SelectLastPenID()\r
         {\r
             Northwind db = CreateDB();\r
 \r
-            var q = from p in db.Products where p.ProductName == "Pen" select p.ProductID;\r
+            var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;\r
             var productID = q.Last();\r
             Assert.Greater(productID, 0, "Expected penID>0, got " + productID);\r
         }\r
 \r
+#if !DEBUG && (POSTGRES || (MSSQL && !L2SQL))\r
+        [Explicit]\r
+#endif\r
         [Test]\r
         public void D04_SelectProducts_OrderByName()\r
         {\r
@@ -410,9 +913,9 @@ using DataLinq = DbLinq.Data.Linq;
         public void D05_SelectOrdersForProduct()\r
         {\r
             Northwind db = CreateDB();\r
-            //var q = from p in db.Products where "Pen"==p.ProductName select p.Order;\r
+            //var q = from p in db.Products where "Chai"==p.ProductName select p.Order;\r
             //List<Order> penOrders = q.ToList();\r
-            //Assert.Greater(penOrders.Count,0,"Expected some orders for product 'Pen'");\r
+            //Assert.Greater(penOrders.Count,0,"Expected some orders for product 'Chai'");\r
 \r
             var q =\r
                 from o in db.Orders\r
@@ -446,6 +949,7 @@ using DataLinq = DbLinq.Data.Linq;
             }\r
             Assert.Greater(list1.Count, 0, "Expected some orders for London customers");\r
         }\r
+\r
         [Test]\r
         public void D07_OrdersFromLondon_Alt()\r
         {\r
@@ -514,6 +1018,10 @@ using DataLinq = DbLinq.Data.Linq;
         }\r
 \r
 \r
+#if !DEBUG && (SQLITE || POSTGRES || MSSQL)\r
+        // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+Northwind1+CustomerDerivedClass' is not mapped as a Table.\r
+        [Explicit]\r
+#endif\r
         [Test]\r
         public void D12_SelectDerivedClass()\r
         {\r
@@ -548,14 +1056,14 @@ using DataLinq = DbLinq.Data.Linq;
         {\r
             Northwind db = CreateDB();\r
 \r
-            var res = db.ExecuteQuery<Pen>(@"SELECT [ProductID] AS PenId FROM [Products] WHERE\r
-              [ProductName] ='Pen'").Single();\r
-            Assert.AreEqual(1, res.PenId);\r
+            var res = db.ExecuteQuery<Chai>(@"SELECT [ProductID] AS ChaiId FROM [Products] WHERE\r
+              [ProductName] ='Chai'").Single();\r
+            Assert.AreEqual(1, res.ChaiId);\r
         }\r
 \r
-        class Pen\r
+        class Chai\r
         {\r
-            internal int PenId;\r
+            internal int ChaiId;\r
         }\r
 \r
         [Test]\r
@@ -582,6 +1090,10 @@ using DataLinq = DbLinq.Data.Linq;
             }\r
         }\r
 \r
+#if !DEBUG && (SQLITE || POSTGRES || MSSQL)\r
+        // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+NorthwindDupl+CustomerDerivedClass' is not mapped as a Table.\r
+        [Explicit]\r
+#endif\r
         [Test]\r
         public void D15_DuplicateProperty()\r
         {\r
@@ -678,5 +1190,26 @@ using DataLinq = DbLinq.Data.Linq;
 \r
         #endregion\r
 \r
+        [Test]\r
+        public void SqlInjectionAttack()\r
+        {\r
+            var db = CreateDB();\r
+            var q = db.Customers.Where(c => c.ContactName == "'; DROP TABLE DoesNotExist; --");\r
+            Assert.AreEqual(0, q.Count());\r
+        }\r
+              \r
+#if POSTGRES || MSSQL\r
+        [Test]\r
+        public void Storage01()\r
+        {\r
+            var db = CreateDB();\r
+            var q = db.NoStorageCategories.Where(c => c.CategoryID == 1);\r
+            var r = q.First();\r
+            Assert.AreEqual(1, q.Count());\r
+            Assert.AreEqual(1, r.CategoryID);\r
+            Assert.IsTrue(r.propertyInvoked_CategoryName);     \r
+            Assert.IsFalse(r.propertyInvoked_Description);     \r
+        }\r
+#endif    \r
     }\r
 }\r