5 // Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne
\r
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
\r
8 // of this software and associated documentation files (the "Software"), to deal
\r
9 // in the Software without restriction, including without limitation the rights
\r
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
\r
11 // copies of the Software, and to permit persons to whom the Software is
\r
12 // furnished to do so, subject to the following conditions:
\r
14 // The above copyright notice and this permission notice shall be included in
\r
15 // all copies or substantial portions of the Software.
\r
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
\r
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
\r
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
\r
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
\r
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
\r
27 using System.Collections.Generic;
\r
30 using NUnit.Framework;
\r
32 using System.Data.Linq.Mapping;
\r
37 using DataLinq = System.Data.Linq;
\r
39 using DataLinq = DbLinq.Data.Linq;
\r
44 namespace Test_NUnit_MySql
\r
46 namespace Test_NUnit_OracleODP
\r
48 namespace Test_NUnit_Oracle
\r
50 namespace Test_NUnit_PostgreSql
\r
52 namespace Test_NUnit_Sqlite
\r
54 namespace Test_NUnit_Ingres
\r
55 #elif MSSQL && L2SQL
\r
56 namespace Test_NUnit_MsSql_Strict
\r
58 namespace Test_NUnit_MsSql
\r
60 namespace Test_NUnit_Firebird
\r
64 public class ReadTest : TestBase
\r
66 #region Tests 'A' check for DB being ready
\r
70 /// in NUnit, tests are executed in alpha order.
\r
71 /// We want to start by checking access to DB.
\r
74 public void A1_PingDatabase()
\r
76 Northwind db = CreateDB();
\r
77 bool pingOK = db.DatabaseExists();
\r
78 //bool pingOK = Conn.Ping(); //Schildkroete - Ping throws NullRef if conn is not open
\r
79 Assert.IsTrue(pingOK, "Pinging database");
\r
84 #if !DEBUG && (MSSQL && L2SQL)
\r
85 // L2SQL doesn't support 'SELECT' queries in DataContext.ExecuteCommand().
\r
89 public void A3_ProductsTableHasPen()
\r
91 Northwind db = CreateDB();
\r
92 //string sql = @"SELECT count(*) FROM linqtestdb.Products WHERE ProductName='Chai'";
\r
93 string sql = @"SELECT count(*) FROM [Products] WHERE [ProductName]='Chai'";
\r
94 long iResult = db.ExecuteCommand(sql);
\r
95 //long iResult = base.ExecuteScalar(sql);
\r
96 Assert.AreEqual(iResult, 1L, "Expecting one Chai in Products table, got:" + iResult + " (SQL:" + sql + ")");
\r
100 public void A4_SelectSingleCustomer()
\r
102 Northwind db = CreateDB();
\r
104 // Query for a specific customer
\r
105 var cust = db.Customers.Single(c => c.CompanyName == "Around the Horn");
\r
106 Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
\r
108 var prod = db.Products.Single(p => p.ProductID == id);
\r
109 Assert.AreEqual("Chai", prod.ProductName);
\r
111 prod = db.Products.Single(p => p.ProductID == id);
\r
112 Assert.AreEqual("Chang", prod.ProductName);
\r
116 public void A5_SelectSingleOrDefault()
\r
118 Northwind db = CreateDB();
\r
120 // Query for a specific customer
\r
121 var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");
\r
122 Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
\r
126 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
127 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
129 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
130 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
132 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id); // Does Not Exist
\r
133 Assert.IsNull(cust);
\r
136 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
137 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
139 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
141 cust = GetCustomerById(db, "ALFKI");
\r
142 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
144 cust = GetCustomerById(db, "BLAUS");
\r
145 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
147 cust = GetCustomerById(db, "DNE");
\r
148 Assert.IsNull(cust);
\r
150 cust = GetCustomerById(db, "ALFKI");
\r
151 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
153 cust = GetCustomerById(db, "BLAUS");
\r
154 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
158 private static Customer GetCustomerById(Northwind db, string id)
\r
160 return db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
165 public void A6_ConnectionOpenTest()
\r
167 Northwind db = CreateDB(System.Data.ConnectionState.Open);
\r
168 Product p1 = db.Products.Single(p => p.ProductID == 1);
\r
169 Assert.IsTrue(p1.ProductID == 1);
\r
173 public void A7_ConnectionClosedTest()
\r
175 Northwind db = CreateDB(System.Data.ConnectionState.Closed);
\r
176 Product p1 = db.Products.Single(p => p.ProductID == 1);
\r
177 Assert.IsTrue(p1.ProductID == 1);
\r
180 public void A8_SelectSingleOrDefault_QueryCacheDisabled()
\r
182 Northwind db = CreateDB();
\r
184 db.QueryCacheEnabled = false;
\r
187 // Query for a specific customer
\r
188 var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");
\r
189 Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
\r
191 cust = GetCustomerById(db, "ALFKI");
\r
192 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
194 cust = GetCustomerById(db, "BLAUS");
\r
195 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
197 cust = GetCustomerById(db, "DNE");
\r
198 Assert.IsNull(cust);
\r
200 cust = GetCustomerById(db, "ALFKI");
\r
201 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
203 cust = GetCustomerById(db, "BLAUS");
\r
204 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
209 //TODO: group B, which checks AllTypes
\r
211 #region Tests 'C' do plain select - no aggregation
\r
213 public void C1_SelectProducts()
\r
215 Northwind db = CreateDB();
\r
217 var q = from p in db.Products select p;
\r
218 List<Product> products = q.ToList();
\r
219 int productCount = products.Count;
\r
220 Assert.Greater(productCount, 0, "Expected some products, got none");
\r
223 #if !DEBUG && SQLITE
\r
227 public void C2_SelectPenId()
\r
229 Northwind db = CreateDB();
\r
231 var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
\r
232 var productIDs = q.ToList();
\r
233 int productCount = productIDs.Count;
\r
234 Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
\r
238 public void C2b_SelectPenId()
\r
240 Northwind db = CreateDB();
\r
243 var q = from p in db.Products where p.ProductName == pen select p.ProductID;
\r
244 var productIDs = q.ToList();
\r
245 int productCount = productIDs.Count;
\r
246 Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
\r
250 public void C3_SelectPenIdName()
\r
252 Northwind db = CreateDB();
\r
254 var q = from p in db.Products
\r
255 where p.ProductName == "Chai"
\r
256 select new { ProductId = p.ProductID, Name = p.ProductName };
\r
259 foreach (var v in q)
\r
261 Assert.AreEqual(v.Name, "Chai", "Expected ProductName='Chai'");
\r
264 Assert.AreEqual(count, 1, "Expected one pen, got count=" + count);
\r
268 public void C4_CountWithOrderBy()
\r
270 Northwind db = CreateDB();
\r
271 var q = (from p in db.Products
\r
272 orderby p.ProductID
\r
274 Assert.IsTrue(q > 0);
\r
278 public void C5_ConstantProperty()
\r
280 Northwind db = CreateDB();
\r
281 var res = from o in db.Orders
\r
282 select new { test = 1 };
\r
283 var list = res.ToList();
\r
284 Assert.AreEqual(db.Orders.Count(), list.Count);
\r
289 public void C6_NullParentEmplyee()
\r
291 //this should generate a LEFT JOIN statement, but currently does not.
\r
292 Northwind db = CreateDB();
\r
294 var query = from e in db.Employees
\r
297 Name = e.FirstName,
\r
298 ReportsTo = e.ReportsToEmployee.FirstName
\r
301 var list = query.ToList();
\r
302 // PC patch: I get 4 results...
\r
303 Assert.IsTrue(list.Count >= 3);
\r
309 public void C7_CaseInsensitiveSubstringSearch()
\r
311 Northwind db = CreateDB();
\r
313 string search = "HERKKU";
\r
314 var query = db.Customers.Where(d => d.CompanyName.ToUpper()
\r
315 .Contains(search));
\r
317 var list = query.ToList();
\r
318 Assert.AreEqual(1, list.Count);
\r
323 /// from http://www.agilior.pt/blogs/pedro.rainho/archive/2008/04/11/4271.aspx
\r
325 #if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))
\r
328 [Test(Description = "Using LIKE operator from linq query")]
\r
329 public void C7B_LikeOperator()
\r
331 Northwind db = CreateDB();
\r
333 //this used to read "Like(HU%F)" but I don't think we have that company.
\r
335 var query = (from c in db.Customers
\r
336 where System.Data.Linq.SqlClient.SqlMethods.Like(c.CompanyName, "Alfre%")
\r
337 select c).ToList();
\r
338 var list = query.ToList();
\r
339 Assert.AreEqual(1, list.Count);
\r
343 public void C8_SelectPenByLocalVariable()
\r
345 Northwind db = CreateDB();
\r
346 string pen = "Chai";
\r
348 var q = from p in db.Products
\r
349 where (p.ProductName == pen)
\r
351 var productIDs = q.ToList();
\r
352 int productCount = productIDs.Count;
\r
353 Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
\r
357 public void C9_OrderByLeftJoin()
\r
359 Northwind db = CreateDB();
\r
360 var q = from p in db.Orders
\r
361 orderby p.Customer.City
\r
364 int count = q.ToList().Count();
\r
365 int ordcount = db.Orders.Count();
\r
366 Assert.AreEqual(ordcount, count);
\r
370 public void C10_ConstantPredicate()
\r
372 Northwind db = CreateDB();
\r
373 var q = from p in db.Customers
\r
377 int count = q.ToList().Count;
\r
378 Assert.AreEqual(count, db.Customers.Count());
\r
382 public void C10b_ConstantPredicate()
\r
384 Northwind db = CreateDB();
\r
385 var q = from p in db.Customers
\r
389 int count = q.Count();
\r
390 Assert.AreEqual(count, 0);
\r
394 public void C10c_ConstantPredicate()
\r
396 Northwind db = CreateDB();
\r
397 var q = from p in db.Customers
\r
398 where (p.Address.StartsWith("A") && false)
\r
401 int count = q.Count();
\r
402 Assert.AreEqual(count, 0);
\r
406 public void C10d_ConstantPredicate()
\r
408 Northwind db = CreateDB();
\r
409 var q = from p in db.Customers
\r
410 where (p.Address.StartsWith("A") || true)
\r
413 int count = q.Count();
\r
414 Assert.AreEqual(count, db.Customers.Count());
\r
418 public void C10e_ConstantPredicate()
\r
420 Northwind db = CreateDB();
\r
421 var q = from p in db.Customers
\r
422 where (p.Address.StartsWith("A") || false)
\r
425 int count = q.Count();
\r
426 Assert.Less(count, db.Customers.Count());
\r
430 public void C10f_ConstantPredicate()
\r
432 Northwind db = CreateDB();
\r
433 var q = from p in db.Customers
\r
434 where (p.Address.StartsWith("A") && true)
\r
437 int count = q.Count();
\r
438 Assert.Less(count, db.Customers.Count());
\r
442 public void C11_SelectProductsDiscontinued()
\r
444 Northwind db = CreateDB();
\r
445 var q = from p in db.Products
\r
447 where p.Discontinued != 0
\r
449 where p.Discontinued == true
\r
451 select p.ProductID;
\r
453 var productIDs = q.ToList();
\r
454 int productCount = productIDs.Count;
\r
455 Assert.AreEqual(productCount, 8, "Expected eight products discontinued, got count=" + productCount);
\r
459 public void C12_SelectEmployee_MultiJoinWithWhere()
\r
461 Northwind db = CreateDB();
\r
462 var q = from t in db.Territories
\r
463 join l in db.EmployeeTerritories on t.TerritoryID equals l.TerritoryID
\r
464 join e in db.Employees on l.EmployeeID equals e.EmployeeID
\r
465 where t.RegionID > 3
\r
467 /* Note that written this way it work, but it's not always possible.
\r
468 var q = from t in db.Territories.Where(t => t.RegionID > 3)
\r
469 join l in db.EmployeeTerritories on t.TerritoryID equals l.TerritoryID
\r
470 join e in db.Employees on l.EmployeeID equals e.EmployeeID
\r
473 var employeeCount = q.Count();
\r
474 Assert.AreEqual(4, employeeCount, "Expected for employees, got count=" + employeeCount);
\r
478 [ExpectedException(ExceptionType=typeof(InvalidOperationException), ExpectedMessage="Data context options cannot be modified after results have been returned from a query.")]
\r
479 public void C13_Changing_ObjectTrackingEnabled2False()
\r
481 Northwind db = CreateDB();
\r
482 var q = from t in db.Territories
\r
484 var territoryCount = q.FirstOrDefault();
\r
485 db.ObjectTrackingEnabled = false;
\r
489 [ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Data context options cannot be modified after results have been returned from a query.")]
\r
490 public void C14_Changing_DeferredLoadingEnabled2False()
\r
492 Northwind db = CreateDB();
\r
493 var q = from t in db.Territories
\r
495 var territoryCount = q.FirstOrDefault();
\r
496 db.DeferredLoadingEnabled = false;
\r
500 [ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Object tracking is not enabled for the current data context instance.")]
\r
501 public void C15_SubmitChanges_DeferredLoadingEnabled_False()
\r
503 Northwind db = CreateDB();
\r
504 db.ObjectTrackingEnabled = false;
\r
505 var q = from t in db.Territories
\r
507 var territoryCount = q.Count();
\r
508 db.SubmitChanges();
\r
512 public void C16_GettingProperty_DeferredLoadingEnabled2False()
\r
514 Northwind db = CreateDB();
\r
515 db.DeferredLoadingEnabled = false;
\r
516 var q = from t in db.Territories
\r
518 Territory territory = q.FirstOrDefault();
\r
519 Assert.IsNotNull(territory);
\r
520 Assert.IsNull(territory.Region);
\r
524 public void C17_GettingProperty_ObjectTrackingEnabled2False()
\r
526 Northwind db = CreateDB();
\r
527 db.ObjectTrackingEnabled = false;
\r
528 var q = from t in db.Territories
\r
530 Territory territory = q.FirstOrDefault();
\r
531 Assert.IsNotNull(territory);
\r
532 Assert.IsNull(territory.Region);
\r
536 public void C18_GettingProperty_LazyLoaded()
\r
538 Northwind db = CreateDB();
\r
539 var q = from t in db.Territories
\r
541 Territory territory = q.FirstOrDefault();
\r
542 Assert.IsNotNull(territory);
\r
543 Assert.IsNotNull(territory.Region);
\r
547 public void C19_SelectEmployee_Fluent()
\r
549 Northwind db = CreateDB();
\r
550 var q = db.GetTable<Territory>()
\r
551 .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
\r
552 .Join(db.GetTable<Employee>().Where(e => e.EmployeeID > 0), l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
\r
553 var employeeCount = q.Count();
\r
554 Assert.Greater(employeeCount, 0, "Expected any employees, got count=" + employeeCount);
\r
558 /// Test the use of DbLinq as a QueryObject
\r
559 /// http://www.martinfowler.com/eaaCatalog/queryObject.html
\r
562 public void C20_SelectEmployee_DbLinqAsQueryObject()
\r
564 Northwind db = CreateDB();
\r
565 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
567 allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");
\r
569 allEmployees = filterByTerritoryName(db, allEmployees, "Neward");
\r
571 Assert.AreEqual(1, allEmployees.Count());
\r
575 public void C21_SelectEmployee_DbLinqAsQueryObjectWithOrderCount()
\r
577 Northwind db = CreateDB();
\r
578 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
580 allEmployees = filterByOrderCountGreaterThan(db, allEmployees, 50);
\r
581 allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");
\r
583 allEmployees = filterByTerritoryNames(db, allEmployees, "Neward", "Boston", "Wilton");
\r
585 int employeesCount = allEmployees.ToList().Count;
\r
587 Assert.AreEqual(employeesCount, allEmployees.Count());
\r
591 private IQueryable<Employee> filterByOrderCountGreaterThan(Northwind db, IQueryable<Employee> allEmployees, int minimumOrderNumber)
\r
593 return from e in allEmployees.Where(e => e.Orders.Count > minimumOrderNumber) select e;
\r
596 private IQueryable<Employee> filterByNameOrSurnameContains(Northwind db, IQueryable<Employee> allEmployees, string namePart)
\r
598 return from e in allEmployees.Where(e => e.FirstName.Contains(namePart) || e.LastName.Contains(namePart)) select e;
\r
601 private IQueryable<Employee> filterByTerritoryName(Northwind db, IQueryable<Employee> allEmployees, string territoryName)
\r
603 IQueryable<Territory> territoryRequired = db.GetTable<Territory>().Where(t => t.TerritoryDescription == territoryName);
\r
604 var q = territoryRequired
\r
605 .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
\r
606 .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
\r
610 private IQueryable<Employee> filterByTerritoryNames(Northwind db, IQueryable<Employee> allEmployees, params string[] territoryNames)
\r
612 IQueryable<Territory> territoryRequired = db.GetTable<Territory>().Where(t => territoryNames.Contains(t.TerritoryDescription));
\r
613 var q = territoryRequired
\r
614 .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
\r
615 .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
\r
620 public void C22_SelectEmployee_GetCommandTextWithNoFilter()
\r
622 Northwind db = CreateDB();
\r
623 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
624 var commandText = db.GetCommand(allEmployees).CommandText;
\r
625 Assert.IsNotNull(commandText);
\r
629 public void C23_SelectEmployees()
\r
631 Northwind db = CreateDB();
\r
632 var allEmployees = db.GetTable<Employee>();
\r
634 foreach (var emp in allEmployees)
\r
638 Assert.AreEqual(9, count);
\r
641 #if !DEBUG && (MSSQL && !L2SQL)
\r
645 public void C24_SelectEmployee_DbLinqAsQueryObjectWithExceptAndImage()
\r
647 // This fail becouse Employee contains a ndata, ndata is not comparable
\r
648 // and EXCEPT make a distinct on DATA
\r
649 Northwind db = CreateDB();
\r
650 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
652 var toExclude = filterByOrderCountGreaterThan(db, allEmployees, 50);
\r
653 allEmployees = filterByNameOrSurnameContains(db, allEmployees, "a").Except(toExclude);
\r
655 string commandText = db.GetCommand(allEmployees).CommandText;
\r
657 int employeesCount = allEmployees.ToList().Count;
\r
659 Assert.AreEqual(employeesCount, allEmployees.Count());
\r
665 #region region D - select first or last - calls IQueryable.Execute instead of GetEnumerator
\r
667 public void D01_SelectFirstPenID()
\r
669 Northwind db = CreateDB();
\r
671 var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
\r
672 var productID = q.First();
\r
673 Assert.Greater(productID, 0, "Expected penID>0, got " + productID);
\r
678 /// Reported by pwy.mail in http://code.google.com/p/dblinq2007/issues/detail?id=67
\r
681 public void D01b_SelectFirstOrDefaultCustomer()
\r
683 Northwind db = CreateDB();
\r
685 from c in db.Customers
\r
688 Customer customer = q.FirstOrDefault();
\r
689 Assert.IsNotNull(customer.CustomerID);
\r
694 public void D02_SelectFirstPen()
\r
696 Northwind db = CreateDB();
\r
698 var q = from p in db.Products where p.ProductName == "Chai" select p;
\r
699 Product pen = q.First();
\r
700 Assert.IsNotNull(pen, "Expected non-null Product");
\r
703 #if !DEBUG && MSSQL
\r
704 // L2SQL: System.NotSupportedException : The query operator 'Last' is not supported.
\r
708 public void D03_SelectLastPenID()
\r
710 Northwind db = CreateDB();
\r
712 var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
\r
713 var productID = q.Last();
\r
714 Assert.Greater(productID, 0, "Expected penID>0, got " + productID);
\r
717 #if !DEBUG && (POSTGRES || (MSSQL && !L2SQL))
\r
721 public void D04_SelectProducts_OrderByName()
\r
723 Northwind db = CreateDB();
\r
725 var q = from p in db.Products orderby p.ProductName select p;
\r
726 string prevProductName = null;
\r
727 foreach (Product p in q)
\r
729 if (prevProductName == p.ProductName && p.ProductName.StartsWith("temp_"))
\r
730 continue; //skip temp rows
\r
732 if (prevProductName != null)
\r
734 //int compareNames = prevProductName.CompareTo(p.ProductName);
\r
735 int compareNames = string.Compare(prevProductName, p.ProductName, stringComparisonType);
\r
736 Assert.Less(compareNames, 0, "When ordering by names, expected " + prevProductName + " to come after " + p.ProductName);
\r
738 prevProductName = p.ProductName;
\r
740 //Assert.Greater(productID,0,"Expected penID>0, got "+productID);
\r
744 public void D05_SelectOrdersForProduct()
\r
746 Northwind db = CreateDB();
\r
747 //var q = from p in db.Products where "Chai"==p.ProductName select p.Order;
\r
748 //List<Order> penOrders = q.ToList();
\r
749 //Assert.Greater(penOrders.Count,0,"Expected some orders for product 'Chai'");
\r
752 from o in db.Orders
\r
753 where o.Customer.City == "London"
\r
754 select new { c = o.Customer, o };
\r
756 var list1 = q.ToList();
\r
757 foreach (var co in list1)
\r
759 Assert.IsNotNull(co.c, "Expected non-null customer");
\r
760 Assert.IsNotNull(co.c.City, "Expected non-null customer city");
\r
761 Assert.IsNotNull(co.o, "Expected non-null order");
\r
763 Assert.Greater(list1.Count, 0, "Expected some orders for London customers");
\r
767 public void D06_OrdersFromLondon()
\r
769 Northwind db = CreateDB();
\r
771 from o in db.Orders
\r
772 where o.Customer.City == "London"
\r
773 select new { c = o.Customer, o };
\r
775 var list1 = q.ToList();
\r
776 foreach (var co in list1)
\r
778 Assert.IsNotNull(co.c, "Expected non-null customer");
\r
779 Assert.IsNotNull(co.o, "Expected non-null order");
\r
781 Assert.Greater(list1.Count, 0, "Expected some orders for London customers");
\r
785 public void D07_OrdersFromLondon_Alt()
\r
787 //this is a "SelectMany" query:
\r
788 Northwind db = CreateDB();
\r
791 from c in db.Customers
\r
793 where c.City == "London"
\r
794 select new { c, o };
\r
796 Assert.Greater(q.ToList().Count, 0, "Expected some orders for London customers");
\r
800 public void D08_Products_Take5()
\r
802 Northwind db = CreateDB();
\r
803 var q = (from p in db.Products select p).Take(5);
\r
804 List<Product> prods = q.ToList();
\r
805 Assert.AreEqual(5, prods.Count, "Expected five products");
\r
809 public void D09_Products_LetterP_Take5()
\r
811 Northwind db = CreateDB();
\r
813 //var q = (from p in db.Products where p.ProductName.Contains("p") select p).Take(5);
\r
814 var q = db.Products.Where(p => p.ProductName.Contains("p")).Take(5);
\r
815 List<Product> prods = q.ToList();
\r
816 #if POSTGRES || INGRES
\r
817 int expectedCount = 0; //Only 'Toilet Paper'
\r
819 int expectedCount = 2; //Oracle, Mysql: 'Toilet Paper' and 'iPod'
\r
821 Assert.Greater(prods.Count, expectedCount, "Expected couple of products with letter 'p'");
\r
825 public void D10_Products_LetterP_Desc()
\r
827 Northwind db = CreateDB();
\r
829 var q = (from p in db.Products
\r
830 where p.ProductName.Contains("P")
\r
831 orderby p.ProductID descending
\r
834 //var q = db.Products.Where( p=>p.ProductName.Contains("p")).Take(5);
\r
835 List<Product> prods = q.ToList();
\r
836 Assert.Greater(prods.Count, 2, "Expected couple of products with letter 'p'");
\r
838 var prodID0 = prods[0].ProductID;
\r
839 var prodID1 = prods[1].ProductID;
\r
840 Assert.Greater(prodID0, prodID1, "Sorting is broken");
\r
844 public void D11_Products_DoubleWhere()
\r
846 Northwind db = CreateDB();
\r
847 var q1 = db.Products.Where(p => p.ProductID > 1).Where(q => q.ProductID < 10);
\r
848 int count1 = q1.Count();
\r
852 #if !DEBUG && (SQLITE || MSSQL)
\r
853 // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+Northwind1+CustomerDerivedClass' is not mapped as a Table.
\r
857 public void D12_SelectDerivedClass()
\r
859 Northwind dbo = CreateDB();
\r
860 Northwind1 db = new Northwind1(dbo.Connection);
\r
862 var derivedCustomer = (from c in db.ChildCustomers
\r
863 where c.City == "London"
\r
865 Assert.IsTrue(derivedCustomer.City == "London");
\r
868 public class Northwind1 : Northwind
\r
870 public Northwind1(System.Data.IDbConnection connection)
\r
874 public class CustomerDerivedClass : Customer { }
\r
875 public class CustomerDerivedClass2 : CustomerDerivedClass { }
\r
877 public DataLinq.Table<CustomerDerivedClass> ChildCustomers
\r
879 get { return base.GetTable<CustomerDerivedClass>(); }
\r
884 [Test(Description = "Calls ExecuteQuery<> to store result into object type property")]
\r
885 // note: for PostgreSQL requires database with lowercase names, NorthwindReqular.SQL
\r
886 public void D13_ExecuteQueryObjectProperty()
\r
888 Northwind db = CreateDB();
\r
890 var res = db.ExecuteQuery<Chai>(@"SELECT [ProductID] AS ChaiId FROM [Products] WHERE
\r
891 [ProductName] ='Chai'").Single();
\r
892 Assert.AreEqual(1, res.ChaiId);
\r
897 internal int ChaiId;
\r
901 public void D14_ProjectedProductList()
\r
903 Northwind db = CreateDB();
\r
905 var query = from pr in db.Products
\r
910 pr.Supplier, // exception!
\r
911 pr.UnitPrice, // exception!
\r
915 //WARNING - as of 2008Apr, we return Suppliers without blowing up, but they need to be live
\r
916 var list = query.ToList();
\r
917 Assert.IsTrue(list.Count > 0);
\r
918 foreach (var item in list)
\r
920 Assert.IsTrue(item.Supplier != null);
\r
924 #if !DEBUG && (SQLITE || MSSQL)
\r
925 // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+NorthwindDupl+CustomerDerivedClass' is not mapped as a Table.
\r
929 public void D15_DuplicateProperty()
\r
931 Northwind dbo = CreateDB();
\r
932 NorthwindDupl db = new NorthwindDupl(dbo.Connection);
\r
933 var derivedCustomer = (from c in db.ChildCustomers
\r
934 where c.City == "London"
\r
936 Assert.IsTrue(derivedCustomer.City == "London");
\r
939 public class NorthwindDupl : Northwind
\r
941 public NorthwindDupl(System.Data.IDbConnection connection)
\r
945 public class CustomerDerivedClass : Customer
\r
947 private string city;
\r
948 [Column(Storage = "city", Name = "city")]
\r
949 public new string City
\r
965 public DataLinq.Table<CustomerDerivedClass> ChildCustomers
\r
967 get { return base.GetTable<CustomerDerivedClass>(); }
\r
972 /// DbLinq must use field and should not look to setter.
\r
974 // PC: is this specified somewhere?
\r
976 public void D16_CustomerWithoutSetter()
\r
978 Assert.Ignore("See if this is specified");
\r
979 Northwind dbo = CreateDB();
\r
980 NorthwindAbstractBaseClass db = new NorthwindAbstractBaseClass(dbo.Connection);
\r
981 var Customer = (from c in db.ChildCustomers
\r
982 where c.City == "London"
\r
984 Assert.IsTrue(Customer.City == "London");
\r
988 abstract class AbstractCustomer
\r
990 public abstract string City { get; }
\r
993 class NorthwindAbstractBaseClass : Northwind
\r
995 public NorthwindAbstractBaseClass(System.Data.IDbConnection connection)
\r
996 : base(connection) { }
\r
998 [Table(Name = "customers")]
\r
999 public class Customer : AbstractCustomer
\r
1002 [Column(Storage = "city", Name = "city")]
\r
1003 public override string City
\r
1012 [Table(Name = "customers")]
\r
1013 public class Customer2 : Customer { }
\r
1015 public DataLinq.Table<Customer2> ChildCustomers
\r
1017 get { return base.GetTable<Customer2>(); }
\r
1025 public void SqlInjectionAttack()
\r
1027 var db = CreateDB();
\r
1028 var q = db.Customers.Where(c => c.ContactName == "'; DROP TABLE DoesNotExist; --");
\r
1029 Assert.AreEqual(0, q.Count());
\r
1032 #if POSTGRES || MSSQL
\r
1034 public void Storage01()
\r
1036 var db = CreateDB();
\r
1037 var q = db.NoStorageCategories.Where(c => c.CategoryID == 1);
\r
1038 var r = q.First();
\r
1039 Assert.AreEqual(1, q.Count());
\r
1040 Assert.AreEqual(1, r.CategoryID);
\r
1041 Assert.IsTrue(r.propertyInvoked_CategoryName);
\r
1042 Assert.IsFalse(r.propertyInvoked_Description);
\r