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 interface IHasAddress
\r
46 string Address { get; set; }
\r
49 partial class Customer : IHasAddress
\r
53 partial class Employee : IHasAddress
\r
60 namespace Test_NUnit_MySql
\r
62 namespace Test_NUnit_OracleODP
\r
64 namespace Test_NUnit_Oracle
\r
66 namespace Test_NUnit_PostgreSql
\r
68 namespace Test_NUnit_Sqlite
\r
70 namespace Test_NUnit_Ingres
\r
71 #elif MSSQL && L2SQL
\r
72 namespace Test_NUnit_MsSql_Strict
\r
74 namespace Test_NUnit_MsSql
\r
76 namespace Test_NUnit_Firebird
\r
80 public class ReadTest : TestBase
\r
82 #region Tests 'A' check for DB being ready
\r
86 /// in NUnit, tests are executed in alpha order.
\r
87 /// We want to start by checking access to DB.
\r
90 public void A1_PingDatabase()
\r
92 Northwind db = CreateDB();
\r
93 bool pingOK = db.DatabaseExists();
\r
94 //bool pingOK = Conn.Ping(); //Schildkroete - Ping throws NullRef if conn is not open
\r
95 Assert.IsTrue(pingOK, "Pinging database");
\r
100 #if !DEBUG && (MSSQL && L2SQL)
\r
101 // L2SQL doesn't support 'SELECT' queries in DataContext.ExecuteCommand().
\r
105 public void A3_ProductsTableHasPen()
\r
107 Northwind db = CreateDB();
\r
108 //string sql = @"SELECT count(*) FROM linqtestdb.Products WHERE ProductName='Chai'";
\r
109 string sql = @"SELECT count(*) FROM [Products] WHERE [ProductName]='Chai'";
\r
110 long iResult = db.ExecuteCommand(sql);
\r
111 //long iResult = base.ExecuteScalar(sql);
\r
112 Assert.AreEqual(iResult, 1L, "Expecting one Chai in Products table, got:" + iResult + " (SQL:" + sql + ")");
\r
116 public void A4_SelectSingleCustomer()
\r
118 Northwind db = CreateDB();
\r
120 // Query for a specific customer
\r
121 var cust = db.Customers.Single(c => c.CompanyName == "Around the Horn");
\r
122 Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
\r
124 var prod = db.Products.Single(p => p.ProductID == id);
\r
125 Assert.AreEqual("Chai", prod.ProductName);
\r
127 prod = db.Products.Single(p => p.ProductID == id);
\r
128 Assert.AreEqual("Chang", prod.ProductName);
\r
132 public void A5_SelectSingleOrDefault()
\r
134 Northwind db = CreateDB();
\r
136 // Query for a specific customer
\r
137 var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");
\r
138 Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
\r
142 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
143 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
145 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
146 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
148 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id); // Does Not Exist
\r
149 Assert.IsNull(cust);
\r
152 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
153 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
155 cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
157 cust = GetCustomerById(db, "ALFKI");
\r
158 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
160 cust = GetCustomerById(db, "BLAUS");
\r
161 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
163 cust = GetCustomerById(db, "DNE");
\r
164 Assert.IsNull(cust);
\r
166 cust = GetCustomerById(db, "ALFKI");
\r
167 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
169 cust = GetCustomerById(db, "BLAUS");
\r
170 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
174 private static Customer GetCustomerById(Northwind db, string id)
\r
176 return db.Customers.SingleOrDefault(c => c.CustomerID == id);
\r
181 public void A6_ConnectionOpenTest()
\r
183 Northwind db = CreateDB(System.Data.ConnectionState.Open);
\r
184 Product p1 = db.Products.Single(p => p.ProductID == 1);
\r
185 Assert.IsTrue(p1.ProductID == 1);
\r
189 public void A7_ConnectionClosedTest()
\r
191 Northwind db = CreateDB(System.Data.ConnectionState.Closed);
\r
192 Product p1 = db.Products.Single(p => p.ProductID == 1);
\r
193 Assert.IsTrue(p1.ProductID == 1);
\r
197 public void A8_SelectSingleOrDefault_QueryCacheDisabled()
\r
199 Northwind db = CreateDB();
\r
201 db.QueryCacheEnabled = true;
\r
204 // Query for a specific customer
\r
205 var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");
\r
206 Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
\r
208 cust = GetCustomerById(db, "ALFKI");
\r
209 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
211 cust = GetCustomerById(db, "BLAUS");
\r
212 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
214 cust = GetCustomerById(db, "DNE");
\r
215 Assert.IsNull(cust);
\r
217 cust = GetCustomerById(db, "ALFKI");
\r
218 Assert.AreEqual("ALFKI", cust.CustomerID);
\r
220 cust = GetCustomerById(db, "BLAUS");
\r
221 Assert.AreEqual("BLAUS", cust.CustomerID);
\r
226 //TODO: group B, which checks AllTypes
\r
228 #region Tests 'C' do plain select - no aggregation
\r
230 public void C1_SelectProducts()
\r
232 Northwind db = CreateDB();
\r
234 var q = from p in db.Products select p;
\r
235 List<Product> products = q.ToList();
\r
236 int productCount = products.Count;
\r
237 Assert.Greater(productCount, 0, "Expected some products, got none");
\r
240 #if !DEBUG && SQLITE
\r
244 public void C2_SelectPenId()
\r
246 Northwind db = CreateDB();
\r
248 var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
\r
249 var productIDs = q.ToList();
\r
250 int productCount = productIDs.Count;
\r
251 Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
\r
255 public void C2b_SelectPenId()
\r
257 Northwind db = CreateDB();
\r
260 var q = from p in db.Products where p.ProductName == pen select p.ProductID;
\r
261 var productIDs = q.ToList();
\r
262 int productCount = productIDs.Count;
\r
263 Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
\r
267 public void C3_SelectPenIdName()
\r
269 Northwind db = CreateDB();
\r
271 var q = from p in db.Products
\r
272 where p.ProductName == "Chai"
\r
273 select new { ProductId = p.ProductID, Name = p.ProductName };
\r
276 foreach (var v in q)
\r
278 Assert.AreEqual(v.Name, "Chai", "Expected ProductName='Chai'");
\r
281 Assert.AreEqual(count, 1, "Expected one pen, got count=" + count);
\r
284 #if !DEBUG && POSTGRES
\r
288 public void C4_CountWithOrderBy()
\r
290 Northwind db = CreateDB();
\r
291 var q = (from p in db.Products
\r
292 orderby p.ProductID
\r
294 Assert.IsTrue(q > 0);
\r
298 public void C5_ConstantProperty()
\r
300 Northwind db = CreateDB();
\r
301 var res = from o in db.Orders
\r
302 select new { test = 1 };
\r
303 var list = res.ToList();
\r
304 Assert.AreEqual(db.Orders.Count(), list.Count);
\r
309 public void C6_NullParentEmplyee()
\r
311 //this should generate a LEFT JOIN statement, but currently does not.
\r
312 Northwind db = CreateDB();
\r
314 var query = from e in db.Employees
\r
317 Name = e.FirstName,
\r
318 ReportsTo = e.ReportsToEmployee.FirstName
\r
321 var list = query.ToList();
\r
322 // PC patch: I get 4 results...
\r
323 Assert.IsTrue(list.Count >= 3);
\r
329 public void C7_CaseInsensitiveSubstringSearch()
\r
331 Northwind db = CreateDB();
\r
333 string search = "HERKKU";
\r
334 var query = db.Customers.Where(d => d.CompanyName.ToUpper()
\r
335 .Contains(search));
\r
337 var list = query.ToList();
\r
338 Assert.AreEqual(1, list.Count);
\r
343 /// from http://www.agilior.pt/blogs/pedro.rainho/archive/2008/04/11/4271.aspx
\r
345 #if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))
\r
348 [Test(Description = "Using LIKE operator from linq query")]
\r
349 public void C7B_LikeOperator()
\r
351 Northwind db = CreateDB();
\r
353 //this used to read "Like(HU%F)" but I don't think we have that company.
\r
355 var query = (from c in db.Customers
\r
356 where System.Data.Linq.SqlClient.SqlMethods.Like(c.CompanyName, "Alfre%")
\r
357 select c).ToList();
\r
358 var list = query.ToList();
\r
359 Assert.AreEqual(1, list.Count);
\r
363 public void C8_SelectPenByLocalVariable()
\r
365 Northwind db = CreateDB();
\r
366 string pen = "Chai";
\r
368 var q = from p in db.Products
\r
369 where (p.ProductName == pen)
\r
371 var productIDs = q.ToList();
\r
372 int productCount = productIDs.Count;
\r
373 Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
\r
377 public void C9_OrderByLeftJoin()
\r
379 Northwind db = CreateDB();
\r
380 var q = from p in db.Orders
\r
381 orderby p.Customer.City
\r
384 int count = q.ToList().Count();
\r
385 int ordcount = db.Orders.Count();
\r
386 Assert.AreEqual(ordcount, count);
\r
390 public void C10_ConstantPredicate()
\r
392 Northwind db = CreateDB();
\r
393 var q = from p in db.Customers
\r
397 int count = q.ToList().Count;
\r
398 Assert.AreEqual(count, db.Customers.Count());
\r
402 public void C10b_ConstantPredicate()
\r
404 Northwind db = CreateDB();
\r
405 var q = from p in db.Customers
\r
409 int count = q.Count();
\r
410 Assert.AreEqual(count, 0);
\r
414 public void C10c_ConstantPredicate()
\r
416 Northwind db = CreateDB();
\r
417 var q = from p in db.Customers
\r
418 where (p.Address.StartsWith("A") && false)
\r
421 int count = q.Count();
\r
422 Assert.AreEqual(count, 0);
\r
426 public void C10d_ConstantPredicate()
\r
428 Northwind db = CreateDB();
\r
429 var q = from p in db.Customers
\r
430 where (p.Address.StartsWith("A") || true)
\r
433 int count = q.Count();
\r
434 Assert.AreEqual(count, db.Customers.Count());
\r
438 public void C10e_ConstantPredicate()
\r
440 Northwind db = CreateDB();
\r
441 var q = from p in db.Customers
\r
442 where (p.Address.StartsWith("A") || false)
\r
445 int count = q.Count();
\r
446 Assert.Less(count, db.Customers.Count());
\r
450 public void C10f_ConstantPredicate()
\r
452 Northwind db = CreateDB();
\r
453 var q = from p in db.Customers
\r
454 where (p.Address.StartsWith("A") && true)
\r
457 int count = q.Count();
\r
458 Assert.Less(count, db.Customers.Count());
\r
462 public void C11_SelectProductsDiscontinued()
\r
464 Northwind db = CreateDB();
\r
465 var q = from p in db.Products
\r
467 where p.Discontinued == "Y"
\r
469 where p.Discontinued == true
\r
471 select p.ProductID;
\r
473 var productIDs = q.ToList();
\r
474 int productCount = productIDs.Count;
\r
475 Assert.AreEqual(productCount, 8, "Expected eight products discontinued, got count=" + productCount);
\r
480 public void C12_SelectEmployee_MultiJoinWithWhere()
\r
482 Northwind db = CreateDB();
\r
483 var q = from t in db.Territories
\r
484 join l in db.EmployeeTerritories on t.TerritoryID equals l.TerritoryID
\r
485 join e in db.Employees on l.EmployeeID equals e.EmployeeID
\r
486 where t.RegionID > 3
\r
488 /* Note that written this way it work, but it's not always possible.
\r
489 var q = from t in db.Territories.Where(t => t.RegionID > 3)
\r
490 join l in db.EmployeeTerritories on t.TerritoryID equals l.TerritoryID
\r
491 join e in db.Employees on l.EmployeeID equals e.EmployeeID
\r
494 var employeeCount = q.Count();
\r
495 Assert.AreEqual(4, employeeCount, "Expected for employees, got count=" + employeeCount);
\r
499 [ExpectedException(ExceptionType=typeof(InvalidOperationException), ExpectedMessage="Data context options cannot be modified after results have been returned from a query.")]
\r
500 public void C13_Changing_ObjectTrackingEnabled2False()
\r
502 Northwind db = CreateDB();
\r
503 var q = from t in db.Territories
\r
505 var territoryCount = q.FirstOrDefault();
\r
506 db.ObjectTrackingEnabled = false;
\r
510 [ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Data context options cannot be modified after results have been returned from a query.")]
\r
511 public void C14_Changing_DeferredLoadingEnabled2False()
\r
513 Northwind db = CreateDB();
\r
514 var q = from t in db.Territories
\r
516 var territoryCount = q.FirstOrDefault();
\r
517 db.DeferredLoadingEnabled = false;
\r
521 [ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Object tracking is not enabled for the current data context instance.")]
\r
522 public void C15_SubmitChanges_DeferredLoadingEnabled_False()
\r
524 Northwind db = CreateDB();
\r
525 db.ObjectTrackingEnabled = false;
\r
526 var q = from t in db.Territories
\r
528 var territoryCount = q.Count();
\r
529 db.SubmitChanges();
\r
533 public void C16_GettingProperty_DeferredLoadingEnabled2False()
\r
535 Northwind db = CreateDB();
\r
536 db.DeferredLoadingEnabled = false;
\r
537 var q = from t in db.Territories
\r
539 Territory territory = q.FirstOrDefault();
\r
540 Assert.IsNotNull(territory);
\r
541 Assert.IsNull(territory.Region);
\r
545 public void C17_GettingProperty_ObjectTrackingEnabled2False()
\r
547 Northwind db = CreateDB();
\r
548 db.ObjectTrackingEnabled = false;
\r
549 var q = from t in db.Territories
\r
551 Territory territory = q.FirstOrDefault();
\r
552 Assert.IsNotNull(territory);
\r
553 Assert.IsNull(territory.Region);
\r
557 public void C18_GettingProperty_LazyLoaded()
\r
559 Northwind db = CreateDB();
\r
560 var q = from t in db.Territories
\r
562 Territory territory = q.FirstOrDefault();
\r
563 Assert.IsNotNull(territory);
\r
564 Assert.IsNotNull(territory.Region);
\r
568 public void C19_SelectEmployee_Fluent()
\r
570 Northwind db = CreateDB();
\r
571 var q = db.GetTable<Territory>()
\r
572 .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
\r
573 .Join(db.GetTable<Employee>().Where(e => e.EmployeeID > 0), l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
\r
574 var employeeCount = q.Count();
\r
575 Assert.Greater(employeeCount, 0, "Expected any employees, got count=" + employeeCount);
\r
579 /// Test the use of DbLinq as a QueryObject
\r
580 /// http://www.martinfowler.com/eaaCatalog/queryObject.html
\r
583 public void C20_SelectEmployee_DbLinqAsQueryObject()
\r
585 Northwind db = CreateDB();
\r
586 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
588 allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");
\r
590 allEmployees = filterByTerritoryName(db, allEmployees, "Neward");
\r
592 Assert.AreEqual(1, allEmployees.Count());
\r
596 public void C21_SelectEmployee_DbLinqAsQueryObjectWithOrderCount()
\r
598 Northwind db = CreateDB();
\r
599 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
601 allEmployees = filterByOrderCountGreaterThan(db, allEmployees, 50);
\r
602 allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");
\r
604 allEmployees = filterByTerritoryNames(db, allEmployees, "Neward", "Boston", "Wilton");
\r
606 int employeesCount = allEmployees.ToList().Count;
\r
608 Assert.AreEqual(employeesCount, allEmployees.Count());
\r
612 private IQueryable<Employee> filterByOrderCountGreaterThan(Northwind db, IQueryable<Employee> allEmployees, int minimumOrderNumber)
\r
614 return from e in allEmployees.Where(e => e.Orders.Count > minimumOrderNumber) select e;
\r
617 private IQueryable<Employee> filterByNameOrSurnameContains(Northwind db, IQueryable<Employee> allEmployees, string namePart)
\r
619 return from e in allEmployees.Where(e => e.FirstName.Contains(namePart) || e.LastName.Contains(namePart)) select e;
\r
622 private IQueryable<Employee> filterByTerritoryName(Northwind db, IQueryable<Employee> allEmployees, string territoryName)
\r
624 IQueryable<Territory> territoryRequired = db.GetTable<Territory>().Where(t => t.TerritoryDescription == territoryName);
\r
625 var q = territoryRequired
\r
626 .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
\r
627 .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
\r
631 private IQueryable<Employee> filterByTerritoryNames(Northwind db, IQueryable<Employee> allEmployees, params string[] territoryNames)
\r
633 IQueryable<Territory> territoryRequired = db.GetTable<Territory>().Where(t => territoryNames.Contains(t.TerritoryDescription));
\r
634 var q = territoryRequired
\r
635 .Join(db.GetTable<EmployeeTerritory>(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
\r
636 .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
\r
641 public void C22_SelectEmployee_GetCommandTextWithNoFilter()
\r
643 Northwind db = CreateDB();
\r
644 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
645 var commandText = db.GetCommand(allEmployees).CommandText;
\r
646 Assert.IsNotNull(commandText);
\r
650 public void C23_SelectEmployees()
\r
652 Northwind db = CreateDB();
\r
653 var allEmployees = db.GetTable<Employee>();
\r
655 foreach (var emp in allEmployees)
\r
659 Assert.AreEqual(9, count);
\r
662 #if !DEBUG && (MSSQL && !L2SQL)
\r
666 public void C24_SelectEmployee_DbLinqAsQueryObjectWithExceptAndImage()
\r
668 // This fail becouse Employee contains a ndata, ndata is not comparable
\r
669 // and EXCEPT make a distinct on DATA
\r
670 Northwind db = CreateDB();
\r
671 IQueryable<Employee> allEmployees = db.GetTable<Employee>();
\r
673 var toExclude = filterByOrderCountGreaterThan(db, allEmployees, 50);
\r
674 allEmployees = filterByNameOrSurnameContains(db, allEmployees, "a").Except(toExclude);
\r
676 string commandText = db.GetCommand(allEmployees).CommandText;
\r
678 int employeesCount = allEmployees.ToList().Count;
\r
680 Assert.AreEqual(employeesCount, allEmployees.Count());
\r
684 public void C25_SelectViaInterface()
\r
686 var db = CreateDB();
\r
687 var c = MatchAddress(db.Customers, "ignoreme").FirstOrDefault();
\r
688 Assert.IsNotNull(c);
\r
689 var e = MatchAddress(db.Employees, "ignoreme").FirstOrDefault();
\r
690 Assert.IsNotNull(e);
\r
693 private static IEnumerable<T> MatchAddress<T>(IQueryable<T> query, string searchValue)
\r
694 where T : IHasAddress
\r
696 var lookups = query.OrderByDescending(v => v.Address.Length);
\r
700 #if !DEBUG && POSTGRES
\r
704 public void C26_SelectWithNestedMethodCall()
\r
706 var db = CreateDB();
\r
708 var q = from e in db.Employees select new
\r
710 BackName = e.LastName + ", " + e.FirstName,
\r
711 StaticName = GetStaticName(e),
\r
712 InstanceName= GetInstanceName(e, s, "constant"),
\r
713 Territories = e.EmployeeTerritories.ToList(),
\r
715 var actual = q.ToList();
\r
716 var expected = new[]{
\r
718 BackName = "Davolio, Nancy",
\r
719 StaticName = "Nancy Davolio [Hired: 1992-05-01]",
\r
720 InstanceName = "Nancy Davolio [Home Phone: (206) 555-9857]",
\r
721 TerritoryCount = 2,
\r
724 BackName = "Fuller, Andrew",
\r
725 StaticName = "Andrew Fuller [Hired: 1992-08-14]",
\r
726 InstanceName = "Andrew Fuller [Home Phone: (206) 555-9482]",
\r
727 TerritoryCount = 7,
\r
730 BackName = "Leverling, Janet",
\r
731 StaticName = "Janet Leverling [Hired: 1992-04-01]",
\r
732 InstanceName = "Janet Leverling [Home Phone: (206) 555-3412]",
\r
733 TerritoryCount = 4,
\r
736 BackName = "Peacock, Margaret",
\r
737 StaticName = "Margaret Peacock [Hired: 1993-05-03]",
\r
738 InstanceName = "Margaret Peacock [Home Phone: (206) 555-8122]",
\r
739 TerritoryCount = 3,
\r
742 BackName = "Buchanan, Steven",
\r
743 StaticName = "Steven Buchanan [Hired: 1993-10-17]",
\r
744 InstanceName = "Steven Buchanan [Home Phone: (71) 555-4848]",
\r
745 TerritoryCount = 7,
\r
748 BackName = "Suyama, Michael",
\r
749 StaticName = "Michael Suyama [Hired: 1993-10-17]",
\r
750 InstanceName = "Michael Suyama [Home Phone: (71) 555-7773]",
\r
751 TerritoryCount = 5,
\r
754 BackName = "King, Robert",
\r
755 StaticName = "Robert King [Hired: 1994-01-02]",
\r
756 InstanceName = "Robert King [Home Phone: (71) 555-5598]",
\r
757 TerritoryCount = 10,
\r
760 BackName = "Callahan, Laura",
\r
761 StaticName = "Laura Callahan [Hired: 1994-03-05]",
\r
762 InstanceName = "Laura Callahan [Home Phone: (206) 555-1189]",
\r
763 TerritoryCount = 4,
\r
766 BackName = "Dodsworth, Anne",
\r
767 StaticName = "Anne Dodsworth [Hired: 1994-11-15]",
\r
768 InstanceName = "Anne Dodsworth [Home Phone: (71) 555-4444]",
\r
769 TerritoryCount = 7,
\r
772 Assert.AreEqual(expected.Length, actual.Count);
\r
773 for (int i = 0; i < expected.Length; ++i)
\r
775 Assert.AreEqual(expected[i].BackName, actual[i].BackName);
\r
776 Assert.AreEqual(expected[i].StaticName, actual[i].StaticName);
\r
777 Assert.AreEqual(expected[i].InstanceName, actual[i].InstanceName);
\r
778 Assert.AreEqual(expected[i].TerritoryCount, actual[i].Territories.Count);
\r
782 static string GetStaticName(Employee e)
\r
784 return e.FirstName + " " + e.LastName + " [Hired: " +
\r
785 (e.HireDate.HasValue ? e.HireDate.Value.ToString("yyyy-MM-dd") : "") + "]";
\r
788 string GetInstanceName(Employee e, string a, string b)
\r
790 return e.FirstName + " " + e.LastName + " [Home Phone: " + e.HomePhone.ToString() + "]";
\r
794 public void C27_SelectEntitySet()
\r
796 // Debugger.Break();
\r
797 var db = CreateDB();
\r
798 var q = from e in db.Employees
\r
799 orderby e.EmployeeID
\r
804 var expectedOrderCounts = new[]{
\r
805 123, // Nancy Davolio
\r
806 96, // Andrew Fuller
\r
807 127, // Janet Leverling
\r
808 156, // Margaret Peacock
\r
809 42, // Steven Buchanan
\r
810 67, // Michael Suyama
\r
812 104, // Laura Callahan
\r
813 43, // Anne Dodsworth
\r
816 foreach (var e in q)
\r
818 Assert.AreEqual(expectedOrderCounts[c], e.Orders.Count);
\r
821 Assert.AreEqual(expectedOrderCounts.Length, c);
\r
825 public void C28_SelectEntityRef()
\r
827 var db = CreateDB();
\r
828 var emp = db.Employees.Single(e => e.EmployeeID == 1);
\r
829 Assert.IsNotNull(emp.ReportsToEmployee);
\r
830 Assert.AreEqual(emp.ReportsTo.Value, emp.ReportsToEmployee.EmployeeID);
\r
834 #region region D - select first or last - calls IQueryable.Execute instead of GetEnumerator
\r
836 public void D01_SelectFirstPenID()
\r
838 Northwind db = CreateDB();
\r
840 var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
\r
841 var productID = q.First();
\r
842 Assert.Greater(productID, 0, "Expected penID>0, got " + productID);
\r
847 /// Reported by pwy.mail in http://code.google.com/p/dblinq2007/issues/detail?id=67
\r
850 public void D01b_SelectFirstOrDefaultCustomer()
\r
852 Northwind db = CreateDB();
\r
854 from c in db.Customers
\r
857 Customer customer = q.FirstOrDefault();
\r
858 Assert.IsNotNull(customer.CustomerID);
\r
863 public void D02_SelectFirstPen()
\r
865 Northwind db = CreateDB();
\r
867 var q = from p in db.Products where p.ProductName == "Chai" select p;
\r
868 Product pen = q.First();
\r
869 Assert.IsNotNull(pen, "Expected non-null Product");
\r
872 #if !DEBUG && MSSQL
\r
873 // L2SQL: System.NotSupportedException : The query operator 'Last' is not supported.
\r
877 public void D03_SelectLastPenID()
\r
879 Northwind db = CreateDB();
\r
881 var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
\r
882 var productID = q.Last();
\r
883 Assert.Greater(productID, 0, "Expected penID>0, got " + productID);
\r
886 #if !DEBUG && (POSTGRES || (MSSQL && !L2SQL))
\r
890 public void D04_SelectProducts_OrderByName()
\r
892 Northwind db = CreateDB();
\r
894 var q = from p in db.Products orderby p.ProductName select p;
\r
895 string prevProductName = null;
\r
896 foreach (Product p in q)
\r
898 if (prevProductName == p.ProductName && p.ProductName.StartsWith("temp_"))
\r
899 continue; //skip temp rows
\r
901 if (prevProductName != null)
\r
903 //int compareNames = prevProductName.CompareTo(p.ProductName);
\r
904 int compareNames = string.Compare(prevProductName, p.ProductName, stringComparisonType);
\r
905 Assert.Less(compareNames, 0, "When ordering by names, expected " + prevProductName + " to come after " + p.ProductName);
\r
907 prevProductName = p.ProductName;
\r
909 //Assert.Greater(productID,0,"Expected penID>0, got "+productID);
\r
913 public void D05_SelectOrdersForProduct()
\r
915 Northwind db = CreateDB();
\r
916 //var q = from p in db.Products where "Chai"==p.ProductName select p.Order;
\r
917 //List<Order> penOrders = q.ToList();
\r
918 //Assert.Greater(penOrders.Count,0,"Expected some orders for product 'Chai'");
\r
921 from o in db.Orders
\r
922 where o.Customer.City == "London"
\r
923 select new { c = o.Customer, o };
\r
925 var list1 = q.ToList();
\r
926 foreach (var co in list1)
\r
928 Assert.IsNotNull(co.c, "Expected non-null customer");
\r
929 Assert.IsNotNull(co.c.City, "Expected non-null customer city");
\r
930 Assert.IsNotNull(co.o, "Expected non-null order");
\r
932 Assert.Greater(list1.Count, 0, "Expected some orders for London customers");
\r
936 public void D06_OrdersFromLondon()
\r
938 Northwind db = CreateDB();
\r
940 from o in db.Orders
\r
941 where o.Customer.City == "London"
\r
942 select new { c = o.Customer, o };
\r
944 var list1 = q.ToList();
\r
945 foreach (var co in list1)
\r
947 Assert.IsNotNull(co.c, "Expected non-null customer");
\r
948 Assert.IsNotNull(co.o, "Expected non-null order");
\r
950 Assert.Greater(list1.Count, 0, "Expected some orders for London customers");
\r
954 public void D07_OrdersFromLondon_Alt()
\r
956 //this is a "SelectMany" query:
\r
957 Northwind db = CreateDB();
\r
960 from c in db.Customers
\r
962 where c.City == "London"
\r
963 select new { c, o };
\r
965 Assert.Greater(q.ToList().Count, 0, "Expected some orders for London customers");
\r
969 public void D08_Products_Take5()
\r
971 Northwind db = CreateDB();
\r
972 var q = (from p in db.Products select p).Take(5);
\r
973 List<Product> prods = q.ToList();
\r
974 Assert.AreEqual(5, prods.Count, "Expected five products");
\r
978 public void D09_Products_LetterP_Take5()
\r
980 Northwind db = CreateDB();
\r
982 //var q = (from p in db.Products where p.ProductName.Contains("p") select p).Take(5);
\r
983 var q = db.Products.Where(p => p.ProductName.Contains("p")).Take(5);
\r
984 List<Product> prods = q.ToList();
\r
985 #if POSTGRES || INGRES
\r
986 int expectedCount = 0; //Only 'Toilet Paper'
\r
988 int expectedCount = 2; //Oracle, Mysql: 'Toilet Paper' and 'iPod'
\r
990 Assert.Greater(prods.Count, expectedCount, "Expected couple of products with letter 'p'");
\r
994 public void D10_Products_LetterP_Desc()
\r
996 Northwind db = CreateDB();
\r
998 var q = (from p in db.Products
\r
999 where p.ProductName.Contains("P")
\r
1000 orderby p.ProductID descending
\r
1003 //var q = db.Products.Where( p=>p.ProductName.Contains("p")).Take(5);
\r
1004 List<Product> prods = q.ToList();
\r
1005 Assert.Greater(prods.Count, 2, "Expected couple of products with letter 'p'");
\r
1007 var prodID0 = prods[0].ProductID;
\r
1008 var prodID1 = prods[1].ProductID;
\r
1009 Assert.Greater(prodID0, prodID1, "Sorting is broken");
\r
1013 public void D11_Products_DoubleWhere()
\r
1015 Northwind db = CreateDB();
\r
1016 var q1 = db.Products.Where(p => p.ProductID > 1).Where(q => q.ProductID < 10);
\r
1017 int count1 = q1.Count();
\r
1021 #if !DEBUG && (SQLITE || POSTGRES || MSSQL)
\r
1022 // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+Northwind1+CustomerDerivedClass' is not mapped as a Table.
\r
1026 public void D12_SelectDerivedClass()
\r
1028 Northwind dbo = CreateDB();
\r
1029 Northwind1 db = new Northwind1(dbo.Connection);
\r
1031 var derivedCustomer = (from c in db.ChildCustomers
\r
1032 where c.City == "London"
\r
1033 select c).First();
\r
1034 Assert.IsTrue(derivedCustomer.City == "London");
\r
1037 public class Northwind1 : Northwind
\r
1039 public Northwind1(System.Data.IDbConnection connection)
\r
1040 : base(connection)
\r
1043 public class CustomerDerivedClass : Customer { }
\r
1044 public class CustomerDerivedClass2 : CustomerDerivedClass { }
\r
1046 public DataLinq.Table<CustomerDerivedClass> ChildCustomers
\r
1048 get { return base.GetTable<CustomerDerivedClass>(); }
\r
1053 [Test(Description = "Calls ExecuteQuery<> to store result into object type property")]
\r
1054 // note: for PostgreSQL requires database with lowercase names, NorthwindReqular.SQL
\r
1055 public void D13_ExecuteQueryObjectProperty()
\r
1057 Northwind db = CreateDB();
\r
1059 var res = db.ExecuteQuery<Chai>(@"SELECT [ProductID] AS ChaiId FROM [Products] WHERE
\r
1060 [ProductName] ='Chai'").Single();
\r
1061 Assert.AreEqual(1, res.ChaiId);
\r
1066 internal int ChaiId;
\r
1070 public void D14_ProjectedProductList()
\r
1072 Northwind db = CreateDB();
\r
1074 var query = from pr in db.Products
\r
1079 pr.Supplier, // exception!
\r
1080 pr.UnitPrice, // exception!
\r
1084 //WARNING - as of 2008Apr, we return Suppliers without blowing up, but they need to be live
\r
1085 var list = query.ToList();
\r
1086 Assert.IsTrue(list.Count > 0);
\r
1087 foreach (var item in list)
\r
1089 Assert.IsTrue(item.Supplier != null);
\r
1093 #if !DEBUG && (SQLITE || POSTGRES || MSSQL)
\r
1094 // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+NorthwindDupl+CustomerDerivedClass' is not mapped as a Table.
\r
1098 public void D15_DuplicateProperty()
\r
1100 Northwind dbo = CreateDB();
\r
1101 NorthwindDupl db = new NorthwindDupl(dbo.Connection);
\r
1102 var derivedCustomer = (from c in db.ChildCustomers
\r
1103 where c.City == "London"
\r
1104 select c).First();
\r
1105 Assert.IsTrue(derivedCustomer.City == "London");
\r
1108 public class NorthwindDupl : Northwind
\r
1110 public NorthwindDupl(System.Data.IDbConnection connection)
\r
1111 : base(connection)
\r
1114 public class CustomerDerivedClass : Customer
\r
1116 private string city;
\r
1117 [Column(Storage = "city", Name = "city")]
\r
1118 public new string City
\r
1126 if (value != city)
\r
1134 public DataLinq.Table<CustomerDerivedClass> ChildCustomers
\r
1136 get { return base.GetTable<CustomerDerivedClass>(); }
\r
1141 /// DbLinq must use field and should not look to setter.
\r
1143 // PC: is this specified somewhere?
\r
1145 public void D16_CustomerWithoutSetter()
\r
1147 Assert.Ignore("See if this is specified");
\r
1148 Northwind dbo = CreateDB();
\r
1149 NorthwindAbstractBaseClass db = new NorthwindAbstractBaseClass(dbo.Connection);
\r
1150 var Customer = (from c in db.ChildCustomers
\r
1151 where c.City == "London"
\r
1152 select c).First();
\r
1153 Assert.IsTrue(Customer.City == "London");
\r
1157 abstract class AbstractCustomer
\r
1159 public abstract string City { get; }
\r
1162 class NorthwindAbstractBaseClass : Northwind
\r
1164 public NorthwindAbstractBaseClass(System.Data.IDbConnection connection)
\r
1165 : base(connection) { }
\r
1167 [Table(Name = "customers")]
\r
1168 public class Customer : AbstractCustomer
\r
1171 [Column(Storage = "city", Name = "city")]
\r
1172 public override string City
\r
1181 [Table(Name = "customers")]
\r
1182 public class Customer2 : Customer { }
\r
1184 public DataLinq.Table<Customer2> ChildCustomers
\r
1186 get { return base.GetTable<Customer2>(); }
\r
1194 public void SqlInjectionAttack()
\r
1196 var db = CreateDB();
\r
1197 var q = db.Customers.Where(c => c.ContactName == "'; DROP TABLE DoesNotExist; --");
\r
1198 Assert.AreEqual(0, q.Count());
\r
1201 #if POSTGRES || MSSQL
\r
1203 public void Storage01()
\r
1205 var db = CreateDB();
\r
1206 var q = db.NoStorageCategories.Where(c => c.CategoryID == 1);
\r
1207 var r = q.First();
\r
1208 Assert.AreEqual(1, q.Count());
\r
1209 Assert.AreEqual(1, r.CategoryID);
\r
1210 Assert.IsTrue(r.propertyInvoked_CategoryName);
\r
1211 Assert.IsFalse(r.propertyInvoked_Description);
\r