PageRenderTime 87ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/MongoDB.DriverUnitTests/Linq/SelectQueryTests.cs

https://github.com/alistair/mongo-csharp-driver
C# | 7426 lines | 6215 code | 1191 blank | 20 comment | 280 complexity | 3d7df08119c880689b739bef954eecb7 MD5 | raw file
Possible License(s): Apache-2.0
  1. /* Copyright 2010-2013 10gen Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Linq.Expressions;
  19. using System.Text.RegularExpressions;
  20. using MongoDB.Bson;
  21. using MongoDB.Bson.Serialization.Attributes;
  22. using MongoDB.Driver;
  23. using MongoDB.Driver.Builders;
  24. using MongoDB.Driver.Linq;
  25. using NUnit.Framework;
  26. namespace MongoDB.DriverUnitTests.Linq
  27. {
  28. [TestFixture]
  29. public class SelectQueryTests
  30. {
  31. public enum E
  32. {
  33. None,
  34. A,
  35. B,
  36. C
  37. }
  38. public class C
  39. {
  40. public ObjectId Id { get; set; }
  41. [BsonElement("x")]
  42. public int X { get; set; }
  43. [BsonElement("lx")]
  44. public long LX { get; set; }
  45. [BsonElement("y")]
  46. public int Y { get; set; }
  47. [BsonElement("d")]
  48. public D D { get; set; }
  49. [BsonElement("da")]
  50. public List<D> DA { get; set; }
  51. [BsonElement("s")]
  52. [BsonIgnoreIfNull]
  53. public string S { get; set; }
  54. [BsonElement("a")]
  55. [BsonIgnoreIfNull]
  56. public int[] A { get; set; }
  57. [BsonElement("b")]
  58. public bool B { get; set; }
  59. [BsonElement("l")]
  60. [BsonIgnoreIfNull]
  61. public List<int> L { get; set; }
  62. [BsonElement("dbref")]
  63. [BsonIgnoreIfNull]
  64. public MongoDBRef DBRef { get; set; }
  65. [BsonElement("e")]
  66. [BsonIgnoreIfDefault]
  67. [BsonRepresentation(BsonType.String)]
  68. public E E { get; set; }
  69. [BsonElement("ea")]
  70. [BsonIgnoreIfNull]
  71. public E[] EA { get; set; }
  72. [BsonElement("sa")]
  73. [BsonIgnoreIfNull]
  74. public string[] SA { get; set; }
  75. [BsonElement("ba")]
  76. [BsonIgnoreIfNull]
  77. public bool[] BA { get; set; }
  78. }
  79. public class D
  80. {
  81. [BsonElement("z")]
  82. public int Z; // use field instead of property to test fields also
  83. public override bool Equals(object obj)
  84. {
  85. if (obj == null || GetType() != obj.GetType()) { return false; }
  86. return Z == ((D)obj).Z;
  87. }
  88. public override int GetHashCode()
  89. {
  90. return Z.GetHashCode();
  91. }
  92. public override string ToString()
  93. {
  94. return string.Format("new D {{ Z = {0} }}", Z);
  95. }
  96. }
  97. // used to test some query operators that have an IEqualityComparer parameter
  98. private class CEqualityComparer : IEqualityComparer<C>
  99. {
  100. public bool Equals(C x, C y)
  101. {
  102. return x.Id.Equals(y.Id) && x.X.Equals(y.X) && x.Y.Equals(y.Y);
  103. }
  104. public int GetHashCode(C obj)
  105. {
  106. return obj.GetHashCode();
  107. }
  108. }
  109. // used to test some query operators that have an IEqualityComparer parameter
  110. private class Int32EqualityComparer : IEqualityComparer<int>
  111. {
  112. public bool Equals(int x, int y)
  113. {
  114. return x == y;
  115. }
  116. public int GetHashCode(int obj)
  117. {
  118. return obj.GetHashCode();
  119. }
  120. }
  121. private MongoServer _server;
  122. private MongoDatabase _database;
  123. private MongoCollection<C> _collection;
  124. private MongoCollection<SystemProfileInfo> _systemProfileCollection;
  125. private ObjectId _id1 = ObjectId.GenerateNewId();
  126. private ObjectId _id2 = ObjectId.GenerateNewId();
  127. private ObjectId _id3 = ObjectId.GenerateNewId();
  128. private ObjectId _id4 = ObjectId.GenerateNewId();
  129. private ObjectId _id5 = ObjectId.GenerateNewId();
  130. [TestFixtureSetUp]
  131. public void Setup()
  132. {
  133. _server = Configuration.TestServer;
  134. _server.Connect();
  135. _database = Configuration.TestDatabase;
  136. _collection = Configuration.GetTestCollection<C>();
  137. _systemProfileCollection = _database.GetCollection<SystemProfileInfo>("system.profile");
  138. // documents inserted deliberately out of order to test sorting
  139. _collection.Drop();
  140. _collection.Insert(new C { Id = _id2, X = 2, LX = 2, Y = 11, D = new D { Z = 22 }, A = new[] { 2, 3, 4 }, DA = new List<D> { new D { Z = 111 }, new D { Z = 222 } }, L = new List<int> { 2, 3, 4 } });
  141. _collection.Insert(new C { Id = _id1, X = 1, LX = 1, Y = 11, D = new D { Z = 11 }, S = "abc", SA = new string[] { "Tom", "Dick", "Harry" } });
  142. _collection.Insert(new C { Id = _id3, X = 3, LX = 3, Y = 33, D = new D { Z = 33 }, B = true, BA = new bool[] { true }, E = E.A, EA = new E[] { E.A, E.B } });
  143. _collection.Insert(new C { Id = _id5, X = 5, LX = 5, Y = 44, D = new D { Z = 55 }, DBRef = new MongoDBRef("db", "c", 1) });
  144. _collection.Insert(new C { Id = _id4, X = 4, LX = 4, Y = 44, D = new D { Z = 44 }, S = " xyz ", DA = new List<D> { new D { Z = 333 }, new D { Z = 444 } } });
  145. }
  146. [Test]
  147. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Aggregate query operator is not supported.")]
  148. public void TestAggregate()
  149. {
  150. var result = (from c in _collection.AsQueryable<C>()
  151. select c).Aggregate((a, b) => null);
  152. }
  153. [Test]
  154. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Aggregate query operator is not supported.")]
  155. public void TestAggregateWithAccumulator()
  156. {
  157. var result = (from c in _collection.AsQueryable<C>()
  158. select c).Aggregate<C, int>(0, (a, c) => 0);
  159. }
  160. [Test]
  161. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Aggregate query operator is not supported.")]
  162. public void TestAggregateWithAccumulatorAndSelector()
  163. {
  164. var result = (from c in _collection.AsQueryable<C>()
  165. select c).Aggregate<C, int, int>(0, (a, c) => 0, a => a);
  166. }
  167. [Test]
  168. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The All query operator is not supported.")]
  169. public void TestAll()
  170. {
  171. var result = (from c in _collection.AsQueryable<C>()
  172. select c).All(c => true);
  173. }
  174. [Test]
  175. public void TestAny()
  176. {
  177. var result = (from c in _collection.AsQueryable<C>()
  178. select c).Any();
  179. Assert.IsTrue(result);
  180. }
  181. [Test]
  182. public void TestAnyWhereXEquals1()
  183. {
  184. var result = (from c in _collection.AsQueryable<C>()
  185. where c.X == 1
  186. select c).Any();
  187. Assert.IsTrue(result);
  188. }
  189. [Test]
  190. public void TestAnyWhereXEquals9()
  191. {
  192. var result = (from c in _collection.AsQueryable<C>()
  193. where c.X == 9
  194. select c).Any();
  195. Assert.IsFalse(result);
  196. }
  197. [Test]
  198. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Any with predicate after a projection is not supported.")]
  199. public void TestAnyWithPredicateAfterProjection()
  200. {
  201. var result = _collection.AsQueryable<C>().Select(c => c.Y).Any(y => y == 11);
  202. }
  203. [Test]
  204. public void TestAnyWithPredicateAfterWhere()
  205. {
  206. var result = _collection.AsQueryable<C>().Where(c => c.X == 1).Any(c => c.Y == 11);
  207. Assert.IsTrue(result);
  208. }
  209. [Test]
  210. public void TestAnyWithPredicateFalse()
  211. {
  212. var result = _collection.AsQueryable<C>().Any(c => c.X == 9);
  213. Assert.IsFalse(result);
  214. }
  215. [Test]
  216. public void TestAnyWithPredicateTrue()
  217. {
  218. var result = _collection.AsQueryable<C>().Any(c => c.X == 1);
  219. Assert.IsTrue(result);
  220. }
  221. [Test]
  222. public void TestAsQueryableWithNothingElse()
  223. {
  224. var query = _collection.AsQueryable<C>();
  225. var result = query.ToList();
  226. Assert.AreEqual(5, result.Count);
  227. }
  228. [Test]
  229. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Average query operator is not supported.")]
  230. public void TestAverage()
  231. {
  232. var result = (from c in _collection.AsQueryable<C>()
  233. select 1.0).Average();
  234. }
  235. [Test]
  236. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Average query operator is not supported.")]
  237. public void TestAverageNullable()
  238. {
  239. var result = (from c in _collection.AsQueryable<C>()
  240. select (double?)1.0).Average();
  241. }
  242. [Test]
  243. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Average query operator is not supported.")]
  244. public void TestAverageWithSelector()
  245. {
  246. var result = (from c in _collection.AsQueryable<C>()
  247. select c).Average(c => 1.0);
  248. }
  249. [Test]
  250. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Average query operator is not supported.")]
  251. public void TestAverageWithSelectorNullable()
  252. {
  253. var result = (from c in _collection.AsQueryable<C>()
  254. select c).Average(c => (double?)1.0);
  255. }
  256. [Test]
  257. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Cast query operator is not supported.")]
  258. public void TestCast()
  259. {
  260. var query = (from c in _collection.AsQueryable<C>()
  261. select c).Cast<C>();
  262. query.ToList(); // execute query
  263. }
  264. [Test]
  265. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Concat query operator is not supported.")]
  266. public void TestConcat()
  267. {
  268. var source2 = new C[0];
  269. var query = (from c in _collection.AsQueryable<C>()
  270. select c).Concat(source2);
  271. query.ToList(); // execute query
  272. }
  273. [Test]
  274. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Contains query operator is not supported.")]
  275. public void TestContains()
  276. {
  277. var item = new C();
  278. var result = (from c in _collection.AsQueryable<C>()
  279. select c).Contains(item);
  280. }
  281. [Test]
  282. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Contains query operator is not supported.")]
  283. public void TestContainsWithEqualityComparer()
  284. {
  285. var item = new C();
  286. var result = (from c in _collection.AsQueryable<C>()
  287. select c).Contains(item, new CEqualityComparer());
  288. }
  289. [Test]
  290. public void TestCountEquals2()
  291. {
  292. var result = (from c in _collection.AsQueryable<C>()
  293. where c.Y == 11
  294. select c).Count();
  295. Assert.AreEqual(2, result);
  296. }
  297. [Test]
  298. public void TestCountEquals5()
  299. {
  300. var result = (from c in _collection.AsQueryable<C>()
  301. select c).Count();
  302. Assert.AreEqual(5, result);
  303. }
  304. [Test]
  305. public void TestCountWithPredicate()
  306. {
  307. var result = _collection.AsQueryable<C>().Count(c => c.Y == 11);
  308. Assert.AreEqual(2, result);
  309. }
  310. [Test]
  311. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Count with predicate after a projection is not supported.")]
  312. public void TestCountWithPredicateAfterProjection()
  313. {
  314. var result = _collection.AsQueryable<C>().Select(c => c.Y).Count(y => y == 11);
  315. }
  316. [Test]
  317. public void TestCountWithPredicateAfterWhere()
  318. {
  319. var result = _collection.AsQueryable<C>().Where(c => c.X == 1).Count(c => c.Y == 11);
  320. Assert.AreEqual(1, result);
  321. }
  322. [Test]
  323. public void TestCountWithSkipAndTake()
  324. {
  325. var result = (from c in _collection.AsQueryable<C>()
  326. select c).Skip(2).Take(2).Count();
  327. Assert.AreEqual(2, result);
  328. }
  329. [Test]
  330. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The DefaultIfEmpty query operator is not supported.")]
  331. public void TestDefaultIfEmpty()
  332. {
  333. var query = (from c in _collection.AsQueryable<C>()
  334. select c).DefaultIfEmpty();
  335. query.ToList(); // execute query
  336. }
  337. [Test]
  338. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The DefaultIfEmpty query operator is not supported.")]
  339. public void TestDefaultIfEmptyWithDefaultValue()
  340. {
  341. var query = (from c in _collection.AsQueryable<C>()
  342. select c).DefaultIfEmpty(null);
  343. query.ToList(); // execute query
  344. }
  345. [Test]
  346. public void TestDistinctASub0()
  347. {
  348. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  349. {
  350. var query = (from c in _collection.AsQueryable<C>()
  351. select c.A[0]).Distinct();
  352. var results = query.ToList();
  353. Assert.AreEqual(1, results.Count);
  354. Assert.IsTrue(results.Contains(2));
  355. }
  356. }
  357. [Test]
  358. public void TestDistinctB()
  359. {
  360. var query = (from c in _collection.AsQueryable<C>()
  361. select c.B).Distinct();
  362. var results = query.ToList();
  363. Assert.AreEqual(2, results.Count);
  364. Assert.IsTrue(results.Contains(false));
  365. Assert.IsTrue(results.Contains(true));
  366. }
  367. [Test]
  368. public void TestDistinctBASub0()
  369. {
  370. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  371. {
  372. var query = (from c in _collection.AsQueryable<C>()
  373. select c.BA[0]).Distinct();
  374. var results = query.ToList();
  375. Assert.AreEqual(1, results.Count);
  376. Assert.IsTrue(results.Contains(true));
  377. }
  378. }
  379. [Test]
  380. public void TestDistinctD()
  381. {
  382. var query = (from c in _collection.AsQueryable<C>()
  383. select c.D).Distinct();
  384. var results = query.ToList(); // execute query
  385. Assert.AreEqual(5, results.Count);
  386. Assert.IsTrue(results.Contains(new D { Z = 11 }));
  387. Assert.IsTrue(results.Contains(new D { Z = 22 }));
  388. Assert.IsTrue(results.Contains(new D { Z = 33 }));
  389. Assert.IsTrue(results.Contains(new D { Z = 44 }));
  390. Assert.IsTrue(results.Contains(new D { Z = 55 }));
  391. }
  392. [Test]
  393. public void TestDistinctDBRef()
  394. {
  395. var query = (from c in _collection.AsQueryable<C>()
  396. select c.DBRef).Distinct();
  397. var results = query.ToList();
  398. Assert.AreEqual(1, results.Count);
  399. Assert.IsTrue(results.Contains(new MongoDBRef("db", "c", 1)));
  400. }
  401. [Test]
  402. public void TestDistinctDBRefDatabase()
  403. {
  404. var query = (from c in _collection.AsQueryable<C>()
  405. select c.DBRef.DatabaseName).Distinct();
  406. var results = query.ToList();
  407. Assert.AreEqual(1, results.Count);
  408. Assert.IsTrue(results.Contains("db"));
  409. }
  410. [Test]
  411. public void TestDistinctDZ()
  412. {
  413. var query = (from c in _collection.AsQueryable<C>()
  414. select c.D.Z).Distinct();
  415. var results = query.ToList();
  416. Assert.AreEqual(5, results.Count);
  417. Assert.IsTrue(results.Contains(11));
  418. Assert.IsTrue(results.Contains(22));
  419. Assert.IsTrue(results.Contains(33));
  420. Assert.IsTrue(results.Contains(44));
  421. Assert.IsTrue(results.Contains(55));
  422. }
  423. [Test]
  424. public void TestDistinctE()
  425. {
  426. var query = (from c in _collection.AsQueryable<C>()
  427. select c.E).Distinct();
  428. var results = query.ToList();
  429. Assert.AreEqual(1, results.Count);
  430. Assert.IsTrue(results.Contains(E.A));
  431. }
  432. [Test]
  433. public void TestDistinctEASub0()
  434. {
  435. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  436. {
  437. var query = (from c in _collection.AsQueryable<C>()
  438. select c.EA[0]).Distinct();
  439. var results = query.ToList();
  440. Assert.AreEqual(1, results.Count);
  441. Assert.IsTrue(results.Contains(E.A));
  442. }
  443. }
  444. [Test]
  445. public void TestDistinctId()
  446. {
  447. var query = (from c in _collection.AsQueryable<C>()
  448. select c.Id).Distinct();
  449. var results = query.ToList();
  450. Assert.AreEqual(5, results.Count);
  451. Assert.IsTrue(results.Contains(_id1));
  452. Assert.IsTrue(results.Contains(_id2));
  453. Assert.IsTrue(results.Contains(_id3));
  454. Assert.IsTrue(results.Contains(_id4));
  455. Assert.IsTrue(results.Contains(_id5));
  456. }
  457. [Test]
  458. public void TestDistinctLSub0()
  459. {
  460. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  461. {
  462. var query = (from c in _collection.AsQueryable<C>()
  463. select c.L[0]).Distinct();
  464. var results = query.ToList();
  465. Assert.AreEqual(1, results.Count);
  466. Assert.IsTrue(results.Contains(2));
  467. }
  468. }
  469. [Test]
  470. public void TestDistinctS()
  471. {
  472. var query = (from c in _collection.AsQueryable<C>()
  473. select c.S).Distinct();
  474. var results = query.ToList();
  475. Assert.AreEqual(2, results.Count);
  476. Assert.IsTrue(results.Contains("abc"));
  477. Assert.IsTrue(results.Contains(" xyz "));
  478. }
  479. [Test]
  480. public void TestDistinctSASub0()
  481. {
  482. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  483. {
  484. var query = (from c in _collection.AsQueryable<C>()
  485. select c.SA[0]).Distinct();
  486. var results = query.ToList();
  487. Assert.AreEqual(1, results.Count);
  488. Assert.IsTrue(results.Contains("Tom"));
  489. }
  490. }
  491. [Test]
  492. public void TestDistinctX()
  493. {
  494. var query = (from c in _collection.AsQueryable<C>()
  495. select c.X).Distinct();
  496. var results = query.ToList();
  497. Assert.AreEqual(5, results.Count);
  498. Assert.IsTrue(results.Contains(1));
  499. Assert.IsTrue(results.Contains(2));
  500. Assert.IsTrue(results.Contains(3));
  501. Assert.IsTrue(results.Contains(4));
  502. Assert.IsTrue(results.Contains(5));
  503. }
  504. [Test]
  505. public void TestDistinctXWithQuery()
  506. {
  507. var query = (from c in _collection.AsQueryable<C>()
  508. where c.X >3
  509. select c.X).Distinct();
  510. var results = query.ToList();
  511. Assert.AreEqual(2, results.Count);
  512. Assert.IsTrue(results.Contains(4));
  513. Assert.IsTrue(results.Contains(5));
  514. }
  515. [Test]
  516. public void TestDistinctY()
  517. {
  518. var query = (from c in _collection.AsQueryable<C>()
  519. select c.Y).Distinct();
  520. var results = query.ToList();
  521. Assert.AreEqual(3, results.Count);
  522. Assert.IsTrue(results.Contains(11));
  523. Assert.IsTrue(results.Contains(33));
  524. Assert.IsTrue(results.Contains(44));
  525. }
  526. [Test]
  527. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The version of the Distinct query operator with an equality comparer is not supported.")]
  528. public void TestDistinctWithEqualityComparer()
  529. {
  530. var query = _collection.AsQueryable<C>().Distinct(new CEqualityComparer());
  531. query.ToList(); // execute query
  532. }
  533. [Test]
  534. public void TestElementAtOrDefaultWithManyMatches()
  535. {
  536. var result = (from c in _collection.AsQueryable<C>()
  537. select c).ElementAtOrDefault(2);
  538. Assert.AreEqual(3, result.X);
  539. Assert.AreEqual(33, result.Y);
  540. }
  541. [Test]
  542. public void TestElementAtOrDefaultWithNoMatch()
  543. {
  544. var result = (from c in _collection.AsQueryable<C>()
  545. where c.X == 9
  546. select c).ElementAtOrDefault(0);
  547. Assert.IsNull(result);
  548. }
  549. [Test]
  550. public void TestElementAtOrDefaultWithOneMatch()
  551. {
  552. var result = (from c in _collection.AsQueryable<C>()
  553. where c.X == 3
  554. select c).ElementAtOrDefault(0);
  555. Assert.AreEqual(3, result.X);
  556. Assert.AreEqual(33, result.Y);
  557. }
  558. [Test]
  559. public void TestElementAtOrDefaultWithTwoMatches()
  560. {
  561. var result = (from c in _collection.AsQueryable<C>()
  562. where c.Y == 11
  563. select c).ElementAtOrDefault(1);
  564. Assert.AreEqual(1, result.X);
  565. Assert.AreEqual(11, result.Y);
  566. }
  567. [Test]
  568. public void TestElementAtWithManyMatches()
  569. {
  570. var result = (from c in _collection.AsQueryable<C>()
  571. select c).ElementAt(2);
  572. Assert.AreEqual(3, result.X);
  573. Assert.AreEqual(33, result.Y);
  574. }
  575. [Test]
  576. [ExpectedException(typeof(InvalidOperationException))]
  577. public void TestElementAtWithNoMatch()
  578. {
  579. var result = (from c in _collection.AsQueryable<C>()
  580. where c.X == 9
  581. select c).ElementAt(0);
  582. }
  583. [Test]
  584. public void TestElementAtWithOneMatch()
  585. {
  586. var result = (from c in _collection.AsQueryable<C>()
  587. where c.X == 3
  588. select c).ElementAt(0);
  589. Assert.AreEqual(3, result.X);
  590. Assert.AreEqual(33, result.Y);
  591. }
  592. [Test]
  593. public void TestElementAtWithTwoMatches()
  594. {
  595. var result = (from c in _collection.AsQueryable<C>()
  596. where c.Y == 11
  597. select c).ElementAt(1);
  598. Assert.AreEqual(1, result.X);
  599. Assert.AreEqual(11, result.Y);
  600. }
  601. [Test]
  602. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Except query operator is not supported.")]
  603. public void TestExcept()
  604. {
  605. var source2 = new C[0];
  606. var query = (from c in _collection.AsQueryable<C>()
  607. select c).Except(source2);
  608. query.ToList(); // execute query
  609. }
  610. [Test]
  611. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Except query operator is not supported.")]
  612. public void TestExceptWithEqualityComparer()
  613. {
  614. var source2 = new C[0];
  615. var query = (from c in _collection.AsQueryable<C>()
  616. select c).Except(source2, new CEqualityComparer());
  617. query.ToList(); // execute query
  618. }
  619. [Test]
  620. public void TestFirstOrDefaultWithManyMatches()
  621. {
  622. var result = (from c in _collection.AsQueryable<C>()
  623. select c).FirstOrDefault();
  624. Assert.AreEqual(2, result.X);
  625. Assert.AreEqual(11, result.Y);
  626. }
  627. [Test]
  628. public void TestFirstOrDefaultWithNoMatch()
  629. {
  630. var result = (from c in _collection.AsQueryable<C>()
  631. where c.X == 9
  632. select c).FirstOrDefault();
  633. Assert.IsNull(result);
  634. }
  635. [Test]
  636. public void TestFirstOrDefaultWithNoMatchAndProjectionToStruct()
  637. {
  638. var result = (from c in _collection.AsQueryable<C>()
  639. where c.X == 9
  640. select c.X).FirstOrDefault();
  641. Assert.AreEqual(0, result);
  642. }
  643. [Test]
  644. public void TestFirstOrDefaultWithOneMatch()
  645. {
  646. var result = (from c in _collection.AsQueryable<C>()
  647. where c.X == 3
  648. select c).FirstOrDefault();
  649. Assert.AreEqual(3, result.X);
  650. Assert.AreEqual(33, result.Y);
  651. }
  652. [Test]
  653. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "FirstOrDefault with predicate after a projection is not supported.")]
  654. public void TestFirstOrDefaultWithPredicateAfterProjection()
  655. {
  656. var result = _collection.AsQueryable<C>().Select(c => c.Y).FirstOrDefault(y => y == 11);
  657. }
  658. [Test]
  659. public void TestFirstOrDefaultWithPredicateAfterWhere()
  660. {
  661. var result = (from c in _collection.AsQueryable<C>()
  662. where c.X == 1
  663. select c).FirstOrDefault(c => c.Y == 11);
  664. Assert.AreEqual(1, result.X);
  665. Assert.AreEqual(11, result.Y);
  666. }
  667. [Test]
  668. public void TestFirstOrDefaultWithPredicateNoMatch()
  669. {
  670. var result = (from c in _collection.AsQueryable<C>()
  671. select c).FirstOrDefault(c => c.X == 9);
  672. Assert.IsNull(result);
  673. }
  674. [Test]
  675. public void TestFirstOrDefaultWithPredicateOneMatch()
  676. {
  677. var result = (from c in _collection.AsQueryable<C>()
  678. select c).FirstOrDefault(c => c.X == 3);
  679. Assert.AreEqual(3, result.X);
  680. Assert.AreEqual(33, result.Y);
  681. }
  682. [Test]
  683. public void TestFirstOrDefaultWithPredicateTwoMatches()
  684. {
  685. var result = (from c in _collection.AsQueryable<C>()
  686. select c).FirstOrDefault(c => c.Y == 11);
  687. Assert.AreEqual(2, result.X);
  688. Assert.AreEqual(11, result.Y);
  689. }
  690. [Test]
  691. public void TestFirstOrDefaultWithTwoMatches()
  692. {
  693. var result = (from c in _collection.AsQueryable<C>()
  694. where c.Y == 11
  695. select c).FirstOrDefault();
  696. Assert.AreEqual(2, result.X);
  697. Assert.AreEqual(11, result.Y);
  698. }
  699. [Test]
  700. public void TestFirstWithManyMatches()
  701. {
  702. var result = (from c in _collection.AsQueryable<C>()
  703. select c).First();
  704. Assert.AreEqual(2, result.X);
  705. Assert.AreEqual(11, result.Y);
  706. }
  707. [Test]
  708. [ExpectedException(typeof(InvalidOperationException))]
  709. public void TestFirstWithNoMatch()
  710. {
  711. var result = (from c in _collection.AsQueryable<C>()
  712. where c.X == 9
  713. select c).First();
  714. }
  715. [Test]
  716. public void TestFirstWithOneMatch()
  717. {
  718. var result = (from c in _collection.AsQueryable<C>()
  719. where c.X == 3
  720. select c).First();
  721. Assert.AreEqual(3, result.X);
  722. Assert.AreEqual(33, result.Y);
  723. }
  724. [Test]
  725. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "First with predicate after a projection is not supported.")]
  726. public void TestFirstWithPredicateAfterProjection()
  727. {
  728. var result = _collection.AsQueryable<C>().Select(c => c.Y).First(y => y == 11);
  729. }
  730. [Test]
  731. public void TestFirstWithPredicateAfterWhere()
  732. {
  733. var result = (from c in _collection.AsQueryable<C>()
  734. where c.X == 1
  735. select c).First(c => c.Y == 11);
  736. Assert.AreEqual(1, result.X);
  737. Assert.AreEqual(11, result.Y);
  738. }
  739. [Test]
  740. public void TestFirstWithPredicateNoMatch()
  741. {
  742. var ex = Assert.Throws<InvalidOperationException>(() =>
  743. {
  744. var result = (from c in _collection.AsQueryable<C>()
  745. select c).First(c => c.X == 9);
  746. });
  747. Assert.AreEqual(ExpectedErrorMessage.FirstEmptySequence, ex.Message);
  748. }
  749. [Test]
  750. public void TestFirstWithPredicateOneMatch()
  751. {
  752. var result = (from c in _collection.AsQueryable<C>()
  753. select c).First(c => c.X == 3);
  754. Assert.AreEqual(3, result.X);
  755. Assert.AreEqual(33, result.Y);
  756. }
  757. [Test]
  758. public void TestFirstWithPredicateTwoMatches()
  759. {
  760. var result = (from c in _collection.AsQueryable<C>()
  761. select c).First(c => c.Y == 11);
  762. Assert.AreEqual(2, result.X);
  763. Assert.AreEqual(11, result.Y);
  764. }
  765. [Test]
  766. public void TestFirstWithTwoMatches()
  767. {
  768. var result = (from c in _collection.AsQueryable<C>()
  769. where c.Y == 11
  770. select c).First();
  771. Assert.AreEqual(2, result.X);
  772. Assert.AreEqual(11, result.Y);
  773. }
  774. [Test]
  775. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  776. public void TestGroupByWithKeySelector()
  777. {
  778. var query = (from c in _collection.AsQueryable<C>()
  779. select c).GroupBy(c => c);
  780. query.ToList(); // execute query
  781. }
  782. [Test]
  783. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  784. public void TestGroupByWithKeySelectorAndElementSelector()
  785. {
  786. var query = (from c in _collection.AsQueryable<C>()
  787. select c).GroupBy(c => c, c => c);
  788. query.ToList(); // execute query
  789. }
  790. [Test]
  791. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  792. public void TestGroupByWithKeySelectorAndElementSelectorAndEqualityComparer()
  793. {
  794. var query = (from c in _collection.AsQueryable<C>()
  795. select c).GroupBy(c => c, c => c, new CEqualityComparer());
  796. query.ToList(); // execute query
  797. }
  798. [Test]
  799. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  800. public void TestGroupByWithKeySelectorAndElementSelectorAndResultSelector()
  801. {
  802. var query = (from c in _collection.AsQueryable<C>()
  803. select c).GroupBy(c => c, c => c, (c, e) => 1.0);
  804. query.ToList(); // execute query
  805. }
  806. [Test]
  807. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  808. public void TestGroupByWithKeySelectorAndElementSelectorAndResultSelectorAndEqualityComparer()
  809. {
  810. var query = (from c in _collection.AsQueryable<C>()
  811. select c).GroupBy(c => c, c => c, (c, e) => e.First(), new CEqualityComparer());
  812. query.ToList(); // execute query
  813. }
  814. [Test]
  815. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  816. public void TestGroupByWithKeySelectorAndEqualityComparer()
  817. {
  818. var query = (from c in _collection.AsQueryable<C>()
  819. select c).GroupBy(c => c, new CEqualityComparer());
  820. query.ToList(); // execute query
  821. }
  822. [Test]
  823. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  824. public void TestGroupByWithKeySelectorAndResultSelector()
  825. {
  826. var query = (from c in _collection.AsQueryable<C>()
  827. select c).GroupBy(c => c, (k, e) => 1.0);
  828. query.ToList(); // execute query
  829. }
  830. [Test]
  831. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupBy query operator is not supported.")]
  832. public void TestGroupByWithKeySelectorAndResultSelectorAndEqualityComparer()
  833. {
  834. var query = (from c in _collection.AsQueryable<C>()
  835. select c).GroupBy(c => c, (k, e) => e.First(), new CEqualityComparer());
  836. query.ToList(); // execute query
  837. }
  838. [Test]
  839. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupJoin query operator is not supported.")]
  840. public void TestGroupJoin()
  841. {
  842. var inner = new C[0];
  843. var query = _collection.AsQueryable<C>().GroupJoin(inner, c => c, c => c, (c, e) => c);
  844. query.ToList(); // execute query
  845. }
  846. [Test]
  847. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The GroupJoin query operator is not supported.")]
  848. public void TestGroupJoinWithEqualityComparer()
  849. {
  850. var inner = new C[0];
  851. var query = _collection.AsQueryable<C>().GroupJoin(inner, c => c, c => c, (c, e) => c, new CEqualityComparer());
  852. query.ToList(); // execute query
  853. }
  854. [Test]
  855. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Intersect query operator is not supported.")]
  856. public void TestIntersect()
  857. {
  858. var source2 = new C[0];
  859. var query = (from c in _collection.AsQueryable<C>()
  860. select c).Intersect(source2);
  861. query.ToList(); // execute query
  862. }
  863. [Test]
  864. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Intersect query operator is not supported.")]
  865. public void TestIntersectWithEqualityComparer()
  866. {
  867. var source2 = new C[0];
  868. var query = (from c in _collection.AsQueryable<C>()
  869. select c).Intersect(source2, new CEqualityComparer());
  870. query.ToList(); // execute query
  871. }
  872. [Test]
  873. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Join query operator is not supported.")]
  874. public void TestJoin()
  875. {
  876. var query = _collection.AsQueryable<C>().Join(_collection.AsQueryable<C>(), c => c.X, c => c.X, (x, y) => x);
  877. query.ToList(); // execute query
  878. }
  879. [Test]
  880. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Join query operator is not supported.")]
  881. public void TestJoinWithEqualityComparer()
  882. {
  883. var query = _collection.AsQueryable<C>().Join(_collection.AsQueryable<C>(), c => c.X, c => c.X, (x, y) => x, new Int32EqualityComparer());
  884. query.ToList(); // execute query
  885. }
  886. [Test]
  887. public void TestLastOrDefaultWithManyMatches()
  888. {
  889. var result = (from c in _collection.AsQueryable<C>()
  890. select c).LastOrDefault();
  891. Assert.AreEqual(4, result.X);
  892. Assert.AreEqual(44, result.Y);
  893. }
  894. [Test]
  895. public void TestLastOrDefaultWithNoMatch()
  896. {
  897. var result = (from c in _collection.AsQueryable<C>()
  898. where c.X == 9
  899. select c).LastOrDefault();
  900. Assert.IsNull(result);
  901. }
  902. [Test]
  903. public void TestLastOrDefaultWithOneMatch()
  904. {
  905. var result = (from c in _collection.AsQueryable<C>()
  906. where c.X == 3
  907. select c).LastOrDefault();
  908. Assert.AreEqual(3, result.X);
  909. Assert.AreEqual(33, result.Y);
  910. }
  911. [Test]
  912. public void TestLastOrDefaultWithOrderBy()
  913. {
  914. var result = (from c in _collection.AsQueryable<C>()
  915. orderby c.X
  916. select c).LastOrDefault();
  917. Assert.AreEqual(5, result.X);
  918. Assert.AreEqual(44, result.Y);
  919. }
  920. [Test]
  921. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "LastOrDefault with predicate after a projection is not supported.")]
  922. public void TestLastOrDefaultWithPredicateAfterProjection()
  923. {
  924. var result = _collection.AsQueryable<C>().Select(c => c.Y).LastOrDefault(y => y == 11);
  925. }
  926. [Test]
  927. public void TestLastOrDefaultWithPredicateAfterWhere()
  928. {
  929. var result = (from c in _collection.AsQueryable<C>()
  930. where c.X == 1
  931. select c).LastOrDefault(c => c.Y == 11);
  932. Assert.AreEqual(1, result.X);
  933. Assert.AreEqual(11, result.Y);
  934. }
  935. [Test]
  936. public void TestLastOrDefaultWithPredicateNoMatch()
  937. {
  938. var result = (from c in _collection.AsQueryable<C>()
  939. select c).LastOrDefault(c => c.X == 9);
  940. Assert.IsNull(result);
  941. }
  942. [Test]
  943. public void TestLastOrDefaultWithPredicateOneMatch()
  944. {
  945. var result = (from c in _collection.AsQueryable<C>()
  946. select c).LastOrDefault(c => c.X == 3);
  947. Assert.AreEqual(3, result.X);
  948. Assert.AreEqual(33, result.Y);
  949. }
  950. [Test]
  951. public void TestLastOrDefaultWithPredicateTwoMatches()
  952. {
  953. var result = (from c in _collection.AsQueryable<C>()
  954. select c).LastOrDefault(c => c.Y == 11);
  955. Assert.AreEqual(1, result.X);
  956. Assert.AreEqual(11, result.Y);
  957. }
  958. [Test]
  959. public void TestLastOrDefaultWithTwoMatches()
  960. {
  961. var result = (from c in _collection.AsQueryable<C>()
  962. where c.Y == 11
  963. select c).LastOrDefault();
  964. Assert.AreEqual(1, result.X);
  965. Assert.AreEqual(11, result.Y);
  966. }
  967. [Test]
  968. public void TestLastWithManyMatches()
  969. {
  970. var result = (from c in _collection.AsQueryable<C>()
  971. select c).Last();
  972. Assert.AreEqual(4, result.X);
  973. Assert.AreEqual(44, result.Y);
  974. }
  975. [Test]
  976. [ExpectedException(typeof(InvalidOperationException))]
  977. public void TestLastWithNoMatch()
  978. {
  979. var result = (from c in _collection.AsQueryable<C>()
  980. where c.X == 9
  981. select c).Last();
  982. }
  983. [Test]
  984. public void TestLastWithOneMatch()
  985. {
  986. var result = (from c in _collection.AsQueryable<C>()
  987. where c.X == 3
  988. select c).Last();
  989. Assert.AreEqual(3, result.X);
  990. Assert.AreEqual(33, result.Y);
  991. }
  992. [Test]
  993. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Last with predicate after a projection is not supported.")]
  994. public void TestLastWithPredicateAfterProjection()
  995. {
  996. var result = _collection.AsQueryable<C>().Select(c => c.Y).Last(y => y == 11);
  997. }
  998. [Test]
  999. public void TestLastWithPredicateAfterWhere()
  1000. {
  1001. var result = (from c in _collection.AsQueryable<C>()
  1002. where c.X == 1
  1003. select c).Last(c => c.Y == 11);
  1004. Assert.AreEqual(1, result.X);
  1005. Assert.AreEqual(11, result.Y);
  1006. }
  1007. [Test]
  1008. public void TestLastWithPredicateNoMatch()
  1009. {
  1010. var ex = Assert.Throws<InvalidOperationException>(() =>
  1011. {
  1012. var result = (from c in _collection.AsQueryable<C>()
  1013. select c).Last(c => c.X == 9);
  1014. });
  1015. Assert.AreEqual(ExpectedErrorMessage.LastEmptySequence, ex.Message);
  1016. }
  1017. [Test]
  1018. public void TestLastWithPredicateOneMatch()
  1019. {
  1020. var result = (from c in _collection.AsQueryable<C>()
  1021. select c).Last(c => c.X == 3);
  1022. Assert.AreEqual(3, result.X);
  1023. Assert.AreEqual(33, result.Y);
  1024. }
  1025. [Test]
  1026. public void TestLastWithPredicateTwoMatches()
  1027. {
  1028. var result = (from c in _collection.AsQueryable<C>()
  1029. select c).Last(c => c.Y == 11);
  1030. Assert.AreEqual(1, result.X);
  1031. Assert.AreEqual(11, result.Y);
  1032. }
  1033. [Test]
  1034. public void TestLastWithOrderBy()
  1035. {
  1036. var result = (from c in _collection.AsQueryable<C>()
  1037. orderby c.X
  1038. select c).Last();
  1039. Assert.AreEqual(5, result.X);
  1040. Assert.AreEqual(44, result.Y);
  1041. }
  1042. [Test]
  1043. public void TestLastWithTwoMatches()
  1044. {
  1045. var result = (from c in _collection.AsQueryable<C>()
  1046. where c.Y == 11
  1047. select c).Last();
  1048. Assert.AreEqual(1, result.X);
  1049. Assert.AreEqual(11, result.Y);
  1050. }
  1051. [Test]
  1052. public void TestLongCountEquals2()
  1053. {
  1054. var result = (from c in _collection.AsQueryable<C>()
  1055. where c.Y == 11
  1056. select c).LongCount();
  1057. Assert.AreEqual(2L, result);
  1058. }
  1059. [Test]
  1060. public void TestLongCountEquals5()
  1061. {
  1062. var result = (from c in _collection.AsQueryable<C>()
  1063. select c).LongCount();
  1064. Assert.AreEqual(5L, result);
  1065. }
  1066. [Test]
  1067. public void TestLongCountWithSkipAndTake()
  1068. {
  1069. var result = (from c in _collection.AsQueryable<C>()
  1070. select c).Skip(2).Take(2).LongCount();
  1071. Assert.AreEqual(2L, result);
  1072. }
  1073. [Test]
  1074. public void TestMaxDZWithProjection()
  1075. {
  1076. var result = (from c in _collection.AsQueryable<C>()
  1077. select c.D.Z).Max();
  1078. Assert.AreEqual(55, result);
  1079. }
  1080. [Test]
  1081. public void TestMaxDZWithSelector()
  1082. {
  1083. var result = (from c in _collection.AsQueryable<C>()
  1084. select c).Max(c => c.D.Z);
  1085. Assert.AreEqual(55, result);
  1086. }
  1087. [Test]
  1088. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Max must be used with either Select or a selector argument, but not both.")]
  1089. public void TestMaxWithProjectionAndSelector()
  1090. {
  1091. var result = (from c in _collection.AsQueryable<C>()
  1092. select c.D).Max(d => d.Z);
  1093. }
  1094. [Test]
  1095. public void TestMaxXWithProjection()
  1096. {
  1097. var result = (from c in _collection.AsQueryable<C>()
  1098. select c.X).Max();
  1099. Assert.AreEqual(5, result);
  1100. }
  1101. [Test]
  1102. public void TestMaxXWithSelector()
  1103. {
  1104. var result = (from c in _collection.AsQueryable<C>()
  1105. select c).Max(c => c.X);
  1106. Assert.AreEqual(5, result);
  1107. }
  1108. [Test]
  1109. public void TestMaxXYWithProjection()
  1110. {
  1111. var result = (from c in _collection.AsQueryable<C>()
  1112. select new { c.X, c.Y }).Max();
  1113. Assert.AreEqual(5, result.X);
  1114. Assert.AreEqual(44, result.Y);
  1115. }
  1116. [Test]
  1117. public void TestMaxXYWithSelector()
  1118. {
  1119. var result = (from c in _collection.AsQueryable<C>()
  1120. select c).Max(c => new { c.X, c.Y });
  1121. Assert.AreEqual(5, result.X);
  1122. Assert.AreEqual(44, result.Y);
  1123. }
  1124. [Test]
  1125. public void TestMinDZWithProjection()
  1126. {
  1127. var result = (from c in _collection.AsQueryable<C>()
  1128. select c.D.Z).Min();
  1129. Assert.AreEqual(11, result);
  1130. }
  1131. [Test]
  1132. public void TestMinDZWithSelector()
  1133. {
  1134. var result = (from c in _collection.AsQueryable<C>()
  1135. select c).Min(c => c.D.Z);
  1136. Assert.AreEqual(11, result);
  1137. }
  1138. [Test]
  1139. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Min must be used with either Select or a selector argument, but not both.")]
  1140. public void TestMinWithProjectionAndSelector()
  1141. {
  1142. var result = (from c in _collection.AsQueryable<C>()
  1143. select c.D).Min(d => d.Z);
  1144. }
  1145. [Test]
  1146. public void TestMinXWithProjection()
  1147. {
  1148. var result = (from c in _collection.AsQueryable<C>()
  1149. select c.X).Min();
  1150. Assert.AreEqual(1, result);
  1151. }
  1152. [Test]
  1153. public void TestMinXWithSelector()
  1154. {
  1155. var result = (from c in _collection.AsQueryable<C>()
  1156. select c).Min(c => c.X);
  1157. Assert.AreEqual(1, result);
  1158. }
  1159. [Test]
  1160. public void TestMinXYWithProjection()
  1161. {
  1162. var result = (from c in _collection.AsQueryable<C>()
  1163. select new { c.X, c.Y }).Min();
  1164. Assert.AreEqual(1, result.X);
  1165. Assert.AreEqual(11, result.Y);
  1166. }
  1167. [Test]
  1168. public void TestMinXYWithSelector()
  1169. {
  1170. var result = (from c in _collection.AsQueryable<C>()
  1171. select c).Min(c => new { c.X, c.Y });
  1172. Assert.AreEqual(1, result.X);
  1173. Assert.AreEqual(11, result.Y);
  1174. }
  1175. [Test]
  1176. public void TestOrderByValueTypeWithObjectReturnType()
  1177. {
  1178. Expression<Func<C, object>> orderByClause = c => c.LX;
  1179. var query = _collection.AsQueryable<C>().OrderBy(orderByClause);
  1180. RunTestOrderByValueTypeWithMismatchingType(query, "(C c) => (Object)c.LX");
  1181. }
  1182. [Test]
  1183. public void TestOrderByValueTypeWithIComparableReturnType()
  1184. {
  1185. Expression<Func<C, IComparable>> orderByClause = c => c.LX;
  1186. var query = _collection.AsQueryable<C>().OrderBy(orderByClause);
  1187. RunTestOrderByValueTypeWithMismatchingType(query, "(C c) => (IComparable)c.LX");
  1188. }
  1189. private void RunTestOrderByValueTypeWithMismatchingType(IOrderedQueryable query, string orderByString)
  1190. {
  1191. var mongoQuery = MongoQueryTranslator.Translate(query);
  1192. Assert.IsInstanceOf<SelectQuery>(mongoQuery);
  1193. var selectQuery = (SelectQuery) mongoQuery;
  1194. Assert.AreEqual(orderByString, ExpressionFormatter.ToString(selectQuery.OrderBy[0].Key));
  1195. }
  1196. [Test]
  1197. public void TestOrderByAscending()
  1198. {
  1199. var query = from c in _collection.AsQueryable<C>()
  1200. orderby c.X
  1201. select c;
  1202. var translatedQuery = MongoQueryTranslator.Translate(query);
  1203. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1204. Assert.AreSame(_collection, translatedQuery.Collection);
  1205. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1206. var selectQuery = (SelectQuery)translatedQuery;
  1207. Assert.IsNull(selectQuery.Where);
  1208. Assert.AreEqual(1, selectQuery.OrderBy.Count);
  1209. Assert.AreEqual("(C c) => c.X", ExpressionFormatter.ToString(selectQuery.OrderBy[0].Key));
  1210. Assert.AreEqual(OrderByDirection.Ascending, selectQuery.OrderBy[0].Direction);
  1211. Assert.IsNull(selectQuery.Projection);
  1212. Assert.IsNull(selectQuery.Skip);
  1213. Assert.IsNull(selectQuery.Take);
  1214. Assert.IsNull(selectQuery.BuildQuery());
  1215. var results = query.ToList();
  1216. Assert.AreEqual(5, results.Count);
  1217. Assert.AreEqual(1, results.First().X);
  1218. Assert.AreEqual(5, results.Last().X);
  1219. }
  1220. [Test]
  1221. public void TestOrderByAscendingThenByAscending()
  1222. {
  1223. var query = from c in _collection.AsQueryable<C>()
  1224. orderby c.Y, c.X
  1225. select c;
  1226. var translatedQuery = MongoQueryTranslator.Translate(query);
  1227. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1228. Assert.AreSame(_collection, translatedQuery.Collection);
  1229. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1230. var selectQuery = (SelectQuery)translatedQuery;
  1231. Assert.IsNull(selectQuery.Where);
  1232. Assert.AreEqual(2, selectQuery.OrderBy.Count);
  1233. Assert.AreEqual("(C c) => c.Y", ExpressionFormatter.ToString(selectQuery.OrderBy[0].Key));
  1234. Assert.AreEqual(OrderByDirection.Ascending, selectQuery.OrderBy[0].Direction);
  1235. Assert.AreEqual("(C c) => c.X", ExpressionFormatter.ToString(selectQuery.OrderBy[1].Key));
  1236. Assert.AreEqual(OrderByDirection.Ascending, selectQuery.OrderBy[1].Direction);
  1237. Assert.IsNull(selectQuery.Projection);
  1238. Assert.IsNull(selectQuery.Skip);
  1239. Assert.IsNull(selectQuery.Take);
  1240. Assert.IsNull(selectQuery.BuildQuery());
  1241. var results = query.ToList();
  1242. Assert.AreEqual(5, results.Count);
  1243. Assert.AreEqual(1, results.First().X);
  1244. Assert.AreEqual(5, results.Last().X);
  1245. }
  1246. [Test]
  1247. public void TestOrderByAscendingThenByDescending()
  1248. {
  1249. var query = from c in _collection.AsQueryable<C>()
  1250. orderby c.Y, c.X descending
  1251. select c;
  1252. var translatedQuery = MongoQueryTranslator.Translate(query);
  1253. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1254. Assert.AreSame(_collection, translatedQuery.Collection);
  1255. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1256. var selectQuery = (SelectQuery)translatedQuery;
  1257. Assert.IsNull(selectQuery.Where);
  1258. Assert.AreEqual(2, selectQuery.OrderBy.Count);
  1259. Assert.AreEqual("(C c) => c.Y", ExpressionFormatter.ToString(selectQuery.OrderBy[0].Key));
  1260. Assert.AreEqual(OrderByDirection.Ascending, selectQuery.OrderBy[0].Direction);
  1261. Assert.AreEqual("(C c) => c.X", ExpressionFormatter.ToString(selectQuery.OrderBy[1].Key));
  1262. Assert.AreEqual(OrderByDirection.Descending, selectQuery.OrderBy[1].Direction);
  1263. Assert.IsNull(selectQuery.Projection);
  1264. Assert.IsNull(selectQuery.Skip);
  1265. Assert.IsNull(selectQuery.Take);
  1266. Assert.IsNull(selectQuery.BuildQuery());
  1267. var results = query.ToList();
  1268. Assert.AreEqual(5, results.Count);
  1269. Assert.AreEqual(2, results.First().X);
  1270. Assert.AreEqual(4, results.Last().X);
  1271. }
  1272. [Test]
  1273. public void TestOrderByDescending()
  1274. {
  1275. var query = from c in _collection.AsQueryable<C>()
  1276. orderby c.X descending
  1277. select c;
  1278. var translatedQuery = MongoQueryTranslator.Translate(query);
  1279. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1280. Assert.AreSame(_collection, translatedQuery.Collection);
  1281. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1282. var selectQuery = (SelectQuery)translatedQuery;
  1283. Assert.IsNull(selectQuery.Where);
  1284. Assert.AreEqual(1, selectQuery.OrderBy.Count);
  1285. Assert.AreEqual("(C c) => c.X", ExpressionFormatter.ToString(selectQuery.OrderBy[0].Key));
  1286. Assert.AreEqual(OrderByDirection.Descending, selectQuery.OrderBy[0].Direction);
  1287. Assert.IsNull(selectQuery.Projection);
  1288. Assert.IsNull(selectQuery.Skip);
  1289. Assert.IsNull(selectQuery.Take);
  1290. Assert.IsNull(selectQuery.BuildQuery());
  1291. var results = query.ToList();
  1292. Assert.AreEqual(5, results.Count);
  1293. Assert.AreEqual(5, results.First().X);
  1294. Assert.AreEqual(1, results.Last().X);
  1295. }
  1296. [Test]
  1297. public void TestOrderByDescendingThenByAscending()
  1298. {
  1299. var query = from c in _collection.AsQueryable<C>()
  1300. orderby c.Y descending, c.X
  1301. select c;
  1302. var translatedQuery = MongoQueryTranslator.Translate(query);
  1303. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1304. Assert.AreSame(_collection, translatedQuery.Collection);
  1305. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1306. var selectQuery = (SelectQuery)translatedQuery;
  1307. Assert.IsNull(selectQuery.Where);
  1308. Assert.AreEqual(2, selectQuery.OrderBy.Count);
  1309. Assert.AreEqual("(C c) => c.Y", ExpressionFormatter.ToString(selectQuery.OrderBy[0].Key));
  1310. Assert.AreEqual(OrderByDirection.Descending, selectQuery.OrderBy[0].Direction);
  1311. Assert.AreEqual("(C c) => c.X", ExpressionFormatter.ToString(selectQuery.OrderBy[1].Key));
  1312. Assert.AreEqual(OrderByDirection.Ascending, selectQuery.OrderBy[1].Direction);
  1313. Assert.IsNull(selectQuery.Projection);
  1314. Assert.IsNull(selectQuery.Skip);
  1315. Assert.IsNull(selectQuery.Take);
  1316. Assert.IsNull(selectQuery.BuildQuery());
  1317. var results = query.ToList();
  1318. Assert.AreEqual(5, results.Count);
  1319. Assert.AreEqual(4, results.First().X);
  1320. Assert.AreEqual(2, results.Last().X);
  1321. }
  1322. [Test]
  1323. public void TestOrderByDescendingThenByDescending()
  1324. {
  1325. var query = from c in _collection.AsQueryable<C>()
  1326. orderby c.Y descending, c.X descending
  1327. select c;
  1328. var translatedQuery = MongoQueryTranslator.Translate(query);
  1329. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1330. Assert.AreSame(_collection, translatedQuery.Collection);
  1331. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1332. var selectQuery = (SelectQuery)translatedQuery;
  1333. Assert.IsNull(selectQuery.Where);
  1334. Assert.AreEqual(2, selectQuery.OrderBy.Count);
  1335. Assert.AreEqual("(C c) => c.Y", ExpressionFormatter.ToString(selectQuery.OrderBy[0].Key));
  1336. Assert.AreEqual(OrderByDirection.Descending, selectQuery.OrderBy[0].Direction);
  1337. Assert.AreEqual("(C c) => c.X", ExpressionFormatter.ToString(selectQuery.OrderBy[1].Key));
  1338. Assert.AreEqual(OrderByDirection.Descending, selectQuery.OrderBy[1].Direction);
  1339. Assert.IsNull(selectQuery.Projection);
  1340. Assert.IsNull(selectQuery.Skip);
  1341. Assert.IsNull(selectQuery.Take);
  1342. Assert.IsNull(selectQuery.BuildQuery());
  1343. var results = query.ToList();
  1344. Assert.AreEqual(5, results.Count);
  1345. Assert.AreEqual(5, results.First().X);
  1346. Assert.AreEqual(1, results.Last().X);
  1347. }
  1348. [Test]
  1349. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Only one OrderBy or OrderByDescending clause is allowed (use ThenBy or ThenByDescending for multiple order by clauses).")]
  1350. public void TestOrderByDuplicate()
  1351. {
  1352. var query = from c in _collection.AsQueryable<C>()
  1353. orderby c.X
  1354. orderby c.Y
  1355. select c;
  1356. MongoQueryTranslator.Translate(query);
  1357. }
  1358. [Test]
  1359. public void TestProjection()
  1360. {
  1361. var query = from c in _collection.AsQueryable<C>()
  1362. select c.X;
  1363. var translatedQuery = MongoQueryTranslator.Translate(query);
  1364. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1365. Assert.AreSame(_collection, translatedQuery.Collection);
  1366. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1367. var selectQuery = (SelectQuery)translatedQuery;
  1368. Assert.IsNull(selectQuery.Where);
  1369. Assert.IsNull(selectQuery.OrderBy);
  1370. Assert.AreEqual("(C c) => c.X", ExpressionFormatter.ToString(selectQuery.Projection));
  1371. Assert.IsNull(selectQuery.Skip);
  1372. Assert.IsNull(selectQuery.Take);
  1373. Assert.IsNull(selectQuery.BuildQuery());
  1374. var results = query.ToList();
  1375. Assert.AreEqual(5, results.Count);
  1376. Assert.AreEqual(2, results.First());
  1377. Assert.AreEqual(4, results.Last());
  1378. }
  1379. [Test]
  1380. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Reverse query operator is not supported.")]
  1381. public void TestReverse()
  1382. {
  1383. var query = (from c in _collection.AsQueryable<C>()
  1384. select c).Reverse();
  1385. query.ToList(); // execute query
  1386. }
  1387. [Test]
  1388. public void TestSelect()
  1389. {
  1390. var query = from c in _collection.AsQueryable<C>()
  1391. select c;
  1392. var translatedQuery = MongoQueryTranslator.Translate(query);
  1393. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1394. Assert.AreSame(_collection, translatedQuery.Collection);
  1395. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1396. var selectQuery = (SelectQuery)translatedQuery;
  1397. Assert.IsNull(selectQuery.Where);
  1398. Assert.IsNull(selectQuery.OrderBy);
  1399. Assert.IsNull(selectQuery.Projection);
  1400. Assert.IsNull(selectQuery.Skip);
  1401. Assert.IsNull(selectQuery.Take);
  1402. Assert.IsNull(selectQuery.BuildQuery());
  1403. Assert.AreEqual(5, Consume(query));
  1404. }
  1405. [Test]
  1406. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The SelectMany query operator is not supported.")]
  1407. public void TestSelectMany()
  1408. {
  1409. var query = _collection.AsQueryable<C>().SelectMany(c => new C[] { c });
  1410. query.ToList(); // execute query
  1411. }
  1412. [Test]
  1413. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The SelectMany query operator is not supported.")]
  1414. public void TestSelectManyWithIndex()
  1415. {
  1416. var query = _collection.AsQueryable<C>().SelectMany((c, index) => new C[] { c });
  1417. query.ToList(); // execute query
  1418. }
  1419. [Test]
  1420. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The SelectMany query operator is not supported.")]
  1421. public void TestSelectManyWithIntermediateResults()
  1422. {
  1423. var query = _collection.AsQueryable<C>().SelectMany(c => new C[] { c }, (c, i) => i);
  1424. query.ToList(); // execute query
  1425. }
  1426. [Test]
  1427. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The SelectMany query operator is not supported.")]
  1428. public void TestSelectManyWithIndexAndIntermediateResults()
  1429. {
  1430. var query = _collection.AsQueryable<C>().SelectMany((c, index) => new C[] { c }, (c, i) => i);
  1431. query.ToList(); // execute query
  1432. }
  1433. [Test]
  1434. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The indexed version of the Select query operator is not supported.")]
  1435. public void TestSelectWithIndex()
  1436. {
  1437. var query = _collection.AsQueryable<C>().Select((c, index) => c);
  1438. query.ToList(); // execute query
  1439. }
  1440. [Test]
  1441. public void TestSelectWithNothingElse()
  1442. {
  1443. var query = from c in _collection.AsQueryable<C>() select c;
  1444. var result = query.ToList();
  1445. Assert.AreEqual(5, result.Count);
  1446. }
  1447. [Test]
  1448. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The SequenceEqual query operator is not supported.")]
  1449. public void TestSequenceEqual()
  1450. {
  1451. var source2 = new C[0];
  1452. var result = (from c in _collection.AsQueryable<C>()
  1453. select c).SequenceEqual(source2);
  1454. }
  1455. [Test]
  1456. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The SequenceEqual query operator is not supported.")]
  1457. public void TestSequenceEqualtWithEqualityComparer()
  1458. {
  1459. var source2 = new C[0];
  1460. var result = (from c in _collection.AsQueryable<C>()
  1461. select c).SequenceEqual(source2, new CEqualityComparer());
  1462. }
  1463. [Test]
  1464. [ExpectedException(typeof(InvalidOperationException))]
  1465. public void TestSingleOrDefaultWithManyMatches()
  1466. {
  1467. var result = (from c in _collection.AsQueryable<C>()
  1468. select c).SingleOrDefault();
  1469. }
  1470. [Test]
  1471. public void TestSingleOrDefaultWithNoMatch()
  1472. {
  1473. var result = (from c in _collection.AsQueryable<C>()
  1474. where c.X == 9
  1475. select c).SingleOrDefault();
  1476. Assert.IsNull(result);
  1477. }
  1478. [Test]
  1479. public void TestSingleOrDefaultWithOneMatch()
  1480. {
  1481. var result = (from c in _collection.AsQueryable<C>()
  1482. where c.X == 3
  1483. select c).SingleOrDefault();
  1484. Assert.AreEqual(3, result.X);
  1485. Assert.AreEqual(33, result.Y);
  1486. }
  1487. [Test]
  1488. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "SingleOrDefault with predicate after a projection is not supported.")]
  1489. public void TestSingleOrDefaultWithPredicateAfterProjection()
  1490. {
  1491. var result = _collection.AsQueryable<C>().Select(c => c.Y).SingleOrDefault(y => y == 11);
  1492. }
  1493. [Test]
  1494. public void TestSingleOrDefaultWithPredicateAfterWhere()
  1495. {
  1496. var result = (from c in _collection.AsQueryable<C>()
  1497. where c.X == 1
  1498. select c).SingleOrDefault(c => c.Y == 11);
  1499. Assert.AreEqual(1, result.X);
  1500. Assert.AreEqual(11, result.Y);
  1501. }
  1502. [Test]
  1503. public void TestSingleOrDefaultWithPredicateNoMatch()
  1504. {
  1505. var result = (from c in _collection.AsQueryable<C>()
  1506. select c).SingleOrDefault(c => c.X == 9);
  1507. Assert.IsNull(result);
  1508. }
  1509. [Test]
  1510. public void TestSingleOrDefaultWithPredicateOneMatch()
  1511. {
  1512. var result = (from c in _collection.AsQueryable<C>()
  1513. select c).SingleOrDefault(c => c.X == 3);
  1514. Assert.AreEqual(3, result.X);
  1515. Assert.AreEqual(33, result.Y);
  1516. }
  1517. [Test]
  1518. public void TestSingleOrDefaultWithPredicateTwoMatches()
  1519. {
  1520. var ex = Assert.Throws<InvalidOperationException>(() =>
  1521. {
  1522. var result = (from c in _collection.AsQueryable<C>()
  1523. select c).SingleOrDefault(c => c.Y == 11);
  1524. });
  1525. Assert.AreEqual(ExpectedErrorMessage.SingleLongSequence, ex.Message);
  1526. }
  1527. [Test]
  1528. [ExpectedException(typeof(InvalidOperationException))]
  1529. public void TestSingleOrDefaultWithTwoMatches()
  1530. {
  1531. var result = (from c in _collection.AsQueryable<C>()
  1532. where c.Y == 11
  1533. select c).SingleOrDefault();
  1534. }
  1535. [Test]
  1536. [ExpectedException(typeof(InvalidOperationException))]
  1537. public void TestSingleWithManyMatches()
  1538. {
  1539. var result = (from c in _collection.AsQueryable<C>()
  1540. select c).Single();
  1541. }
  1542. [Test]
  1543. [ExpectedException(typeof(InvalidOperationException))]
  1544. public void TestSingleWithNoMatch()
  1545. {
  1546. var result = (from c in _collection.AsQueryable<C>()
  1547. where c.X == 9
  1548. select c).Single();
  1549. }
  1550. [Test]
  1551. public void TestSingleWithOneMatch()
  1552. {
  1553. var result = (from c in _collection.AsQueryable<C>()
  1554. where c.X == 3
  1555. select c).Single();
  1556. Assert.AreEqual(3, result.X);
  1557. Assert.AreEqual(33, result.Y);
  1558. }
  1559. [Test]
  1560. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Single with predicate after a projection is not supported.")]
  1561. public void TestSingleWithPredicateAfterProjection()
  1562. {
  1563. var result = _collection.AsQueryable<C>().Select(c => c.Y).Single(y => y == 11);
  1564. }
  1565. [Test]
  1566. public void TestSingleWithPredicateAfterWhere()
  1567. {
  1568. var result = (from c in _collection.AsQueryable<C>()
  1569. where c.X == 1
  1570. select c).Single(c => c.Y == 11);
  1571. Assert.AreEqual(1, result.X);
  1572. Assert.AreEqual(11, result.Y);
  1573. }
  1574. [Test]
  1575. public void TestSingleWithPredicateNoMatch()
  1576. {
  1577. var ex = Assert.Throws<InvalidOperationException>(() =>
  1578. {
  1579. var result = (from c in _collection.AsQueryable<C>()
  1580. select c).Single(c => c.X == 9);
  1581. });
  1582. Assert.AreEqual(ExpectedErrorMessage.SingleEmptySequence, ex.Message);
  1583. }
  1584. [Test]
  1585. public void TestSingleWithPredicateOneMatch()
  1586. {
  1587. var result = (from c in _collection.AsQueryable<C>()
  1588. select c).Single(c => c.X == 3);
  1589. Assert.AreEqual(3, result.X);
  1590. Assert.AreEqual(33, result.Y);
  1591. }
  1592. [Test]
  1593. public void TestSingleWithPredicateTwoMatches()
  1594. {
  1595. var ex = Assert.Throws<InvalidOperationException>(() =>
  1596. {
  1597. var result = (from c in _collection.AsQueryable<C>()
  1598. select c).Single(c => c.Y == 11);
  1599. });
  1600. Assert.AreEqual(ExpectedErrorMessage.SingleLongSequence, ex.Message);
  1601. }
  1602. [Test]
  1603. [ExpectedException(typeof(InvalidOperationException))]
  1604. public void TestSingleWithTwoMatches()
  1605. {
  1606. var result = (from c in _collection.AsQueryable<C>()
  1607. where c.Y == 11
  1608. select c).Single();
  1609. }
  1610. [Test]
  1611. public void TestSkip2()
  1612. {
  1613. var query = (from c in _collection.AsQueryable<C>()
  1614. select c).Skip(2);
  1615. var translatedQuery = MongoQueryTranslator.Translate(query);
  1616. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1617. Assert.AreSame(_collection, translatedQuery.Collection);
  1618. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1619. var selectQuery = (SelectQuery)translatedQuery;
  1620. Assert.IsNull(selectQuery.Where);
  1621. Assert.IsNull(selectQuery.OrderBy);
  1622. Assert.IsNull(selectQuery.Projection);
  1623. Assert.AreEqual(2, selectQuery.Skip);
  1624. Assert.IsNull(selectQuery.Take);
  1625. Assert.IsNull(selectQuery.BuildQuery());
  1626. Assert.AreEqual(3, Consume(query));
  1627. }
  1628. [Test]
  1629. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The SkipWhile query operator is not supported.")]
  1630. public void TestSkipWhile()
  1631. {
  1632. var query = _collection.AsQueryable<C>().SkipWhile(c => true);
  1633. query.ToList(); // execute query
  1634. }
  1635. [Test]
  1636. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Sum query operator is not supported.")]
  1637. public void TestSum()
  1638. {
  1639. var result = (from c in _collection.AsQueryable<C>()
  1640. select 1.0).Sum();
  1641. }
  1642. [Test]
  1643. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Sum query operator is not supported.")]
  1644. public void TestSumNullable()
  1645. {
  1646. var result = (from c in _collection.AsQueryable<C>()
  1647. select (double?)1.0).Sum();
  1648. }
  1649. [Test]
  1650. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Sum query operator is not supported.")]
  1651. public void TestSumWithSelector()
  1652. {
  1653. var result = (from c in _collection.AsQueryable<C>()
  1654. select c).Sum(c => 1.0);
  1655. }
  1656. [Test]
  1657. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Sum query operator is not supported.")]
  1658. public void TestSumWithSelectorNullable()
  1659. {
  1660. var result = (from c in _collection.AsQueryable<C>()
  1661. select c).Sum(c => (double?)1.0);
  1662. }
  1663. [Test]
  1664. public void TestTake2()
  1665. {
  1666. var query = (from c in _collection.AsQueryable<C>()
  1667. select c).Take(2);
  1668. var translatedQuery = MongoQueryTranslator.Translate(query);
  1669. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1670. Assert.AreSame(_collection, translatedQuery.Collection);
  1671. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1672. var selectQuery = (SelectQuery)translatedQuery;
  1673. Assert.IsNull(selectQuery.Where);
  1674. Assert.IsNull(selectQuery.OrderBy);
  1675. Assert.IsNull(selectQuery.Projection);
  1676. Assert.IsNull(selectQuery.Skip);
  1677. Assert.AreEqual(2, selectQuery.Take);
  1678. Assert.IsNull(selectQuery.BuildQuery());
  1679. Assert.AreEqual(2, Consume(query));
  1680. }
  1681. [Test]
  1682. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The TakeWhile query operator is not supported.")]
  1683. public void TestTakeWhile()
  1684. {
  1685. var query = _collection.AsQueryable<C>().TakeWhile(c => true);
  1686. query.ToList(); // execute query
  1687. }
  1688. [Test]
  1689. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "ThenBy or ThenByDescending can only be used after OrderBy or OrderByDescending.")]
  1690. public void TestThenByWithMissingOrderBy()
  1691. {
  1692. // not sure this could ever happen in real life without deliberate sabotaging like with this cast
  1693. var query = ((IOrderedQueryable<C>)_collection.AsQueryable<C>())
  1694. .ThenBy(c => c.X);
  1695. MongoQueryTranslator.Translate(query);
  1696. }
  1697. [Test]
  1698. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Union query operator is not supported.")]
  1699. public void TestUnion()
  1700. {
  1701. var source2 = new C[0];
  1702. var query = (from c in _collection.AsQueryable<C>()
  1703. select c).Union(source2);
  1704. query.ToList(); // execute query
  1705. }
  1706. [Test]
  1707. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The Union query operator is not supported.")]
  1708. public void TestUnionWithEqualityComparer()
  1709. {
  1710. var source2 = new C[0];
  1711. var query = (from c in _collection.AsQueryable<C>()
  1712. select c).Union(source2, new CEqualityComparer());
  1713. query.ToList(); // execute query
  1714. }
  1715. [Test]
  1716. public void TestWhereAAny()
  1717. {
  1718. var query = from c in _collection.AsQueryable<C>()
  1719. where c.A.Any()
  1720. select c;
  1721. var translatedQuery = MongoQueryTranslator.Translate(query);
  1722. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1723. Assert.AreSame(_collection, translatedQuery.Collection);
  1724. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1725. var selectQuery = (SelectQuery)translatedQuery;
  1726. Assert.AreEqual("(C c) => Enumerable.Any<Int32>(c.A)", ExpressionFormatter.ToString(selectQuery.Where));
  1727. Assert.IsNull(selectQuery.OrderBy);
  1728. Assert.IsNull(selectQuery.Projection);
  1729. Assert.IsNull(selectQuery.Skip);
  1730. Assert.IsNull(selectQuery.Take);
  1731. Assert.AreEqual("{ \"a\" : { \"$ne\" : null, \"$not\" : { \"$size\" : 0 } } }", selectQuery.BuildQuery().ToJson());
  1732. Assert.AreEqual(1, Consume(query));
  1733. }
  1734. [Test]
  1735. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "Any is only support for items that serialize into documents. The current serializer is Int32Serializer and must implement IBsonDocumentSerializer for participation in Any queries.")]
  1736. public void TestWhereAAnyWithPredicate()
  1737. {
  1738. var query = from c in _collection.AsQueryable<C>()
  1739. where c.A.Any(a => a > 3)
  1740. select c;
  1741. var translatedQuery = MongoQueryTranslator.Translate(query);
  1742. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1743. Assert.AreSame(_collection, translatedQuery.Collection);
  1744. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1745. var selectQuery = (SelectQuery)translatedQuery;
  1746. Assert.AreEqual("(C c) => Enumerable.Any<Int32>(c.A, (Int32 a) => (a > 3))", ExpressionFormatter.ToString(selectQuery.Where));
  1747. Assert.IsNull(selectQuery.OrderBy);
  1748. Assert.IsNull(selectQuery.Projection);
  1749. Assert.IsNull(selectQuery.Skip);
  1750. Assert.IsNull(selectQuery.Take);
  1751. Assert.AreEqual("{ \"a\" : 2 }", selectQuery.BuildQuery().ToJson());
  1752. Assert.AreEqual(1, Consume(query));
  1753. }
  1754. [Test]
  1755. public void TestWhereLocalListContainsX()
  1756. {
  1757. var local = new List<int> { 1, 2, 3 };
  1758. var query = from c in _collection.AsQueryable<C>()
  1759. where local.Contains(c.X)
  1760. select c;
  1761. var translatedQuery = MongoQueryTranslator.Translate(query);
  1762. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1763. Assert.AreSame(_collection, translatedQuery.Collection);
  1764. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1765. var selectQuery = (SelectQuery)translatedQuery;
  1766. Assert.AreEqual("(C c) => System.Collections.Generic.List`1[System.Int32].Contains(c.X)", ExpressionFormatter.ToString(selectQuery.Where));
  1767. Assert.IsNull(selectQuery.OrderBy);
  1768. Assert.IsNull(selectQuery.Projection);
  1769. Assert.IsNull(selectQuery.Skip);
  1770. Assert.IsNull(selectQuery.Take);
  1771. Assert.AreEqual("{ \"x\" : { \"$in\" : [1, 2, 3] } }", selectQuery.BuildQuery().ToJson());
  1772. Assert.AreEqual(3, Consume(query));
  1773. }
  1774. [Test]
  1775. public void TestWhereLocalArrayContainsX()
  1776. {
  1777. var local = new [] { 1, 2, 3 };
  1778. var query = from c in _collection.AsQueryable<C>()
  1779. where local.Contains(c.X)
  1780. select c;
  1781. var translatedQuery = MongoQueryTranslator.Translate(query);
  1782. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1783. Assert.AreSame(_collection, translatedQuery.Collection);
  1784. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1785. var selectQuery = (SelectQuery)translatedQuery;
  1786. Assert.AreEqual("(C c) => Enumerable.Contains<Int32>(Int32[]:{ 1, 2, 3 }, c.X)", ExpressionFormatter.ToString(selectQuery.Where));
  1787. Assert.IsNull(selectQuery.OrderBy);
  1788. Assert.IsNull(selectQuery.Projection);
  1789. Assert.IsNull(selectQuery.Skip);
  1790. Assert.IsNull(selectQuery.Take);
  1791. Assert.AreEqual("{ \"x\" : { \"$in\" : [1, 2, 3] } }", selectQuery.BuildQuery().ToJson());
  1792. Assert.AreEqual(3, Consume(query));
  1793. }
  1794. [Test]
  1795. public void TestWhereAContains2()
  1796. {
  1797. var query = from c in _collection.AsQueryable<C>()
  1798. where c.A.Contains(2)
  1799. select c;
  1800. var translatedQuery = MongoQueryTranslator.Translate(query);
  1801. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1802. Assert.AreSame(_collection, translatedQuery.Collection);
  1803. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1804. var selectQuery = (SelectQuery)translatedQuery;
  1805. Assert.AreEqual("(C c) => Enumerable.Contains<Int32>(c.A, 2)", ExpressionFormatter.ToString(selectQuery.Where));
  1806. Assert.IsNull(selectQuery.OrderBy);
  1807. Assert.IsNull(selectQuery.Projection);
  1808. Assert.IsNull(selectQuery.Skip);
  1809. Assert.IsNull(selectQuery.Take);
  1810. Assert.AreEqual("{ \"a\" : 2 }", selectQuery.BuildQuery().ToJson());
  1811. Assert.AreEqual(1, Consume(query));
  1812. }
  1813. [Test]
  1814. public void TestWhereAContains2Not()
  1815. {
  1816. var query = from c in _collection.AsQueryable<C>()
  1817. where !c.A.Contains(2)
  1818. select c;
  1819. var translatedQuery = MongoQueryTranslator.Translate(query);
  1820. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1821. Assert.AreSame(_collection, translatedQuery.Collection);
  1822. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1823. var selectQuery = (SelectQuery)translatedQuery;
  1824. Assert.AreEqual("(C c) => !Enumerable.Contains<Int32>(c.A, 2)", ExpressionFormatter.ToString(selectQuery.Where));
  1825. Assert.IsNull(selectQuery.OrderBy);
  1826. Assert.IsNull(selectQuery.Projection);
  1827. Assert.IsNull(selectQuery.Skip);
  1828. Assert.IsNull(selectQuery.Take);
  1829. Assert.AreEqual("{ \"a\" : { \"$ne\" : 2 } }", selectQuery.BuildQuery().ToJson());
  1830. Assert.AreEqual(4, Consume(query));
  1831. }
  1832. [Test]
  1833. public void TestWhereAContainsAll()
  1834. {
  1835. var query = from c in _collection.AsQueryable<C>()
  1836. where c.A.ContainsAll(new[] { 2, 3 })
  1837. select c;
  1838. var translatedQuery = MongoQueryTranslator.Translate(query);
  1839. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1840. Assert.AreSame(_collection, translatedQuery.Collection);
  1841. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1842. var selectQuery = (SelectQuery)translatedQuery;
  1843. Assert.AreEqual("(C c) => LinqToMongo.ContainsAll<Int32>(c.A, Int32[]:{ 2, 3 })", ExpressionFormatter.ToString(selectQuery.Where));
  1844. Assert.IsNull(selectQuery.OrderBy);
  1845. Assert.IsNull(selectQuery.Projection);
  1846. Assert.IsNull(selectQuery.Skip);
  1847. Assert.IsNull(selectQuery.Take);
  1848. Assert.AreEqual("{ \"a\" : { \"$all\" : [2, 3] } }", selectQuery.BuildQuery().ToJson());
  1849. Assert.AreEqual(1, Consume(query));
  1850. }
  1851. [Test]
  1852. public void TestWhereAContainsAllNot()
  1853. {
  1854. var query = from c in _collection.AsQueryable<C>()
  1855. where !c.A.ContainsAll(new[] { 2, 3 })
  1856. select c;
  1857. var translatedQuery = MongoQueryTranslator.Translate(query);
  1858. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1859. Assert.AreSame(_collection, translatedQuery.Collection);
  1860. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1861. var selectQuery = (SelectQuery)translatedQuery;
  1862. Assert.AreEqual("(C c) => !LinqToMongo.ContainsAll<Int32>(c.A, Int32[]:{ 2, 3 })", ExpressionFormatter.ToString(selectQuery.Where));
  1863. Assert.IsNull(selectQuery.OrderBy);
  1864. Assert.IsNull(selectQuery.Projection);
  1865. Assert.IsNull(selectQuery.Skip);
  1866. Assert.IsNull(selectQuery.Take);
  1867. Assert.AreEqual("{ \"a\" : { \"$not\" : { \"$all\" : [2, 3] } } }", selectQuery.BuildQuery().ToJson());
  1868. Assert.AreEqual(4, Consume(query));
  1869. }
  1870. [Test]
  1871. public void TestWhereAContainsAny()
  1872. {
  1873. var query = from c in _collection.AsQueryable<C>()
  1874. where c.A.ContainsAny(new[] { 2, 3 })
  1875. select c;
  1876. var translatedQuery = MongoQueryTranslator.Translate(query);
  1877. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1878. Assert.AreSame(_collection, translatedQuery.Collection);
  1879. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1880. var selectQuery = (SelectQuery)translatedQuery;
  1881. Assert.AreEqual("(C c) => LinqToMongo.ContainsAny<Int32>(c.A, Int32[]:{ 2, 3 })", ExpressionFormatter.ToString(selectQuery.Where));
  1882. Assert.IsNull(selectQuery.OrderBy);
  1883. Assert.IsNull(selectQuery.Projection);
  1884. Assert.IsNull(selectQuery.Skip);
  1885. Assert.IsNull(selectQuery.Take);
  1886. Assert.AreEqual("{ \"a\" : { \"$in\" : [2, 3] } }", selectQuery.BuildQuery().ToJson());
  1887. Assert.AreEqual(1, Consume(query));
  1888. }
  1889. [Test]
  1890. public void TestWhereAContainsAnyNot()
  1891. {
  1892. var query = from c in _collection.AsQueryable<C>()
  1893. where !c.A.ContainsAny(new[] { 1, 2 })
  1894. select c;
  1895. var translatedQuery = MongoQueryTranslator.Translate(query);
  1896. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1897. Assert.AreSame(_collection, translatedQuery.Collection);
  1898. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1899. var selectQuery = (SelectQuery)translatedQuery;
  1900. Assert.AreEqual("(C c) => !LinqToMongo.ContainsAny<Int32>(c.A, Int32[]:{ 1, 2 })", ExpressionFormatter.ToString(selectQuery.Where));
  1901. Assert.IsNull(selectQuery.OrderBy);
  1902. Assert.IsNull(selectQuery.Projection);
  1903. Assert.IsNull(selectQuery.Skip);
  1904. Assert.IsNull(selectQuery.Take);
  1905. Assert.AreEqual("{ \"a\" : { \"$nin\" : [1, 2] } }", selectQuery.BuildQuery().ToJson());
  1906. Assert.AreEqual(4, Consume(query));
  1907. }
  1908. [Test]
  1909. public void TestWhereAExistsFalse()
  1910. {
  1911. var query = from c in _collection.AsQueryable<C>()
  1912. where Query.NotExists("a").Inject()
  1913. select c;
  1914. var translatedQuery = MongoQueryTranslator.Translate(query);
  1915. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1916. Assert.AreSame(_collection, translatedQuery.Collection);
  1917. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1918. var selectQuery = (SelectQuery)translatedQuery;
  1919. Assert.AreEqual("(C c) => LinqToMongo.Inject({ \"a\" : { \"$exists\" : false } })", ExpressionFormatter.ToString(selectQuery.Where));
  1920. Assert.IsNull(selectQuery.OrderBy);
  1921. Assert.IsNull(selectQuery.Projection);
  1922. Assert.IsNull(selectQuery.Skip);
  1923. Assert.IsNull(selectQuery.Take);
  1924. Assert.AreEqual("{ \"a\" : { \"$exists\" : false } }", selectQuery.BuildQuery().ToJson());
  1925. Assert.AreEqual(4, Consume(query));
  1926. }
  1927. [Test]
  1928. public void TestWhereAExistsTrue()
  1929. {
  1930. var query = from c in _collection.AsQueryable<C>()
  1931. where Query.Exists("a").Inject()
  1932. select c;
  1933. var translatedQuery = MongoQueryTranslator.Translate(query);
  1934. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1935. Assert.AreSame(_collection, translatedQuery.Collection);
  1936. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1937. var selectQuery = (SelectQuery)translatedQuery;
  1938. Assert.AreEqual("(C c) => LinqToMongo.Inject({ \"a\" : { \"$exists\" : true } })", ExpressionFormatter.ToString(selectQuery.Where));
  1939. Assert.IsNull(selectQuery.OrderBy);
  1940. Assert.IsNull(selectQuery.Projection);
  1941. Assert.IsNull(selectQuery.Skip);
  1942. Assert.IsNull(selectQuery.Take);
  1943. Assert.AreEqual("{ \"a\" : { \"$exists\" : true } }", selectQuery.BuildQuery().ToJson());
  1944. Assert.AreEqual(1, Consume(query));
  1945. }
  1946. [Test]
  1947. public void TestWhereAExistsTrueNot()
  1948. {
  1949. var query = from c in _collection.AsQueryable<C>()
  1950. where !Query.Exists("a").Inject()
  1951. select c;
  1952. var translatedQuery = MongoQueryTranslator.Translate(query);
  1953. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1954. Assert.AreSame(_collection, translatedQuery.Collection);
  1955. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1956. var selectQuery = (SelectQuery)translatedQuery;
  1957. Assert.AreEqual("(C c) => !LinqToMongo.Inject({ \"a\" : { \"$exists\" : true } })", ExpressionFormatter.ToString(selectQuery.Where));
  1958. Assert.IsNull(selectQuery.OrderBy);
  1959. Assert.IsNull(selectQuery.Projection);
  1960. Assert.IsNull(selectQuery.Skip);
  1961. Assert.IsNull(selectQuery.Take);
  1962. Assert.AreEqual("{ \"a\" : { \"$exists\" : false } }", selectQuery.BuildQuery().ToJson());
  1963. Assert.AreEqual(4, Consume(query));
  1964. }
  1965. [Test]
  1966. public void TestWhereALengthEquals3()
  1967. {
  1968. var query = from c in _collection.AsQueryable<C>()
  1969. where c.A.Length == 3
  1970. select c;
  1971. var translatedQuery = MongoQueryTranslator.Translate(query);
  1972. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1973. Assert.AreSame(_collection, translatedQuery.Collection);
  1974. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1975. var selectQuery = (SelectQuery)translatedQuery;
  1976. Assert.AreEqual("(C c) => (c.A.Length == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  1977. Assert.IsNull(selectQuery.OrderBy);
  1978. Assert.IsNull(selectQuery.Projection);
  1979. Assert.IsNull(selectQuery.Skip);
  1980. Assert.IsNull(selectQuery.Take);
  1981. Assert.AreEqual("{ \"a\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  1982. Assert.AreEqual(1, Consume(query));
  1983. }
  1984. [Test]
  1985. public void TestWhereALengthEquals3Not()
  1986. {
  1987. var query = from c in _collection.AsQueryable<C>()
  1988. where !(c.A.Length == 3)
  1989. select c;
  1990. var translatedQuery = MongoQueryTranslator.Translate(query);
  1991. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  1992. Assert.AreSame(_collection, translatedQuery.Collection);
  1993. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  1994. var selectQuery = (SelectQuery)translatedQuery;
  1995. Assert.AreEqual("(C c) => !(c.A.Length == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  1996. Assert.IsNull(selectQuery.OrderBy);
  1997. Assert.IsNull(selectQuery.Projection);
  1998. Assert.IsNull(selectQuery.Skip);
  1999. Assert.IsNull(selectQuery.Take);
  2000. Assert.AreEqual("{ \"a\" : { \"$not\" : { \"$size\" : 3 } } }", selectQuery.BuildQuery().ToJson());
  2001. Assert.AreEqual(4, Consume(query));
  2002. }
  2003. [Test]
  2004. public void TestWhereALengthEquals3Reversed()
  2005. {
  2006. var query = from c in _collection.AsQueryable<C>()
  2007. where 3 == c.A.Length
  2008. select c;
  2009. var translatedQuery = MongoQueryTranslator.Translate(query);
  2010. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2011. Assert.AreSame(_collection, translatedQuery.Collection);
  2012. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2013. var selectQuery = (SelectQuery)translatedQuery;
  2014. Assert.AreEqual("(C c) => (c.A.Length == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  2015. Assert.IsNull(selectQuery.OrderBy);
  2016. Assert.IsNull(selectQuery.Projection);
  2017. Assert.IsNull(selectQuery.Skip);
  2018. Assert.IsNull(selectQuery.Take);
  2019. Assert.AreEqual("{ \"a\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  2020. Assert.AreEqual(1, Consume(query));
  2021. }
  2022. [Test]
  2023. public void TestWhereALengthNotEquals3()
  2024. {
  2025. var query = from c in _collection.AsQueryable<C>()
  2026. where c.A.Length != 3
  2027. select c;
  2028. var translatedQuery = MongoQueryTranslator.Translate(query);
  2029. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2030. Assert.AreSame(_collection, translatedQuery.Collection);
  2031. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2032. var selectQuery = (SelectQuery)translatedQuery;
  2033. Assert.AreEqual("(C c) => (c.A.Length != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  2034. Assert.IsNull(selectQuery.OrderBy);
  2035. Assert.IsNull(selectQuery.Projection);
  2036. Assert.IsNull(selectQuery.Skip);
  2037. Assert.IsNull(selectQuery.Take);
  2038. Assert.AreEqual("{ \"a\" : { \"$not\" : { \"$size\" : 3 } } }", selectQuery.BuildQuery().ToJson());
  2039. Assert.AreEqual(4, Consume(query));
  2040. }
  2041. [Test]
  2042. public void TestWhereALengthNotEquals3Not()
  2043. {
  2044. var query = from c in _collection.AsQueryable<C>()
  2045. where !(c.A.Length != 3)
  2046. select c;
  2047. var translatedQuery = MongoQueryTranslator.Translate(query);
  2048. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2049. Assert.AreSame(_collection, translatedQuery.Collection);
  2050. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2051. var selectQuery = (SelectQuery)translatedQuery;
  2052. Assert.AreEqual("(C c) => !(c.A.Length != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  2053. Assert.IsNull(selectQuery.OrderBy);
  2054. Assert.IsNull(selectQuery.Projection);
  2055. Assert.IsNull(selectQuery.Skip);
  2056. Assert.IsNull(selectQuery.Take);
  2057. Assert.AreEqual("{ \"a\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  2058. Assert.AreEqual(1, Consume(query));
  2059. }
  2060. [Test]
  2061. public void TestWhereASub1Equals3()
  2062. {
  2063. var query = from c in _collection.AsQueryable<C>()
  2064. where c.A[1] == 3
  2065. select c;
  2066. var translatedQuery = MongoQueryTranslator.Translate(query);
  2067. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2068. Assert.AreSame(_collection, translatedQuery.Collection);
  2069. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2070. var selectQuery = (SelectQuery)translatedQuery;
  2071. Assert.AreEqual("(C c) => (c.A[1] == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  2072. Assert.IsNull(selectQuery.OrderBy);
  2073. Assert.IsNull(selectQuery.Projection);
  2074. Assert.IsNull(selectQuery.Skip);
  2075. Assert.IsNull(selectQuery.Take);
  2076. Assert.AreEqual("{ \"a.1\" : 3 }", selectQuery.BuildQuery().ToJson());
  2077. Assert.AreEqual(1, Consume(query));
  2078. }
  2079. [Test]
  2080. public void TestWhereASub1Equals3Not()
  2081. {
  2082. var query = from c in _collection.AsQueryable<C>()
  2083. where !(c.A[1] == 3)
  2084. select c;
  2085. var translatedQuery = MongoQueryTranslator.Translate(query);
  2086. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2087. Assert.AreSame(_collection, translatedQuery.Collection);
  2088. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2089. var selectQuery = (SelectQuery)translatedQuery;
  2090. Assert.AreEqual("(C c) => !(c.A[1] == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  2091. Assert.IsNull(selectQuery.OrderBy);
  2092. Assert.IsNull(selectQuery.Projection);
  2093. Assert.IsNull(selectQuery.Skip);
  2094. Assert.IsNull(selectQuery.Take);
  2095. Assert.AreEqual("{ \"a.1\" : { \"$ne\" : 3 } }", selectQuery.BuildQuery().ToJson());
  2096. Assert.AreEqual(4, Consume(query));
  2097. }
  2098. [Test]
  2099. public void TestWhereASub1ModTwoEquals1()
  2100. {
  2101. var query = from c in _collection.AsQueryable<C>()
  2102. where c.A[1] % 2 == 1
  2103. select c;
  2104. var translatedQuery = MongoQueryTranslator.Translate(query);
  2105. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2106. Assert.AreSame(_collection, translatedQuery.Collection);
  2107. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2108. var selectQuery = (SelectQuery)translatedQuery;
  2109. Assert.AreEqual("(C c) => ((c.A[1] % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2110. Assert.IsNull(selectQuery.OrderBy);
  2111. Assert.IsNull(selectQuery.Projection);
  2112. Assert.IsNull(selectQuery.Skip);
  2113. Assert.IsNull(selectQuery.Take);
  2114. Assert.AreEqual("{ \"a.1\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  2115. Assert.AreEqual(1, Consume(query));
  2116. }
  2117. [Test]
  2118. public void TestWhereASub1ModTwoEquals1Not()
  2119. {
  2120. var query = from c in _collection.AsQueryable<C>()
  2121. where !(c.A[1] % 2 == 1)
  2122. select c;
  2123. var translatedQuery = MongoQueryTranslator.Translate(query);
  2124. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2125. Assert.AreSame(_collection, translatedQuery.Collection);
  2126. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2127. var selectQuery = (SelectQuery)translatedQuery;
  2128. Assert.AreEqual("(C c) => !((c.A[1] % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2129. Assert.IsNull(selectQuery.OrderBy);
  2130. Assert.IsNull(selectQuery.Projection);
  2131. Assert.IsNull(selectQuery.Skip);
  2132. Assert.IsNull(selectQuery.Take);
  2133. Assert.AreEqual("{ \"a.1\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  2134. Assert.AreEqual(4, Consume(query));
  2135. }
  2136. [Test]
  2137. public void TestWhereASub1ModTwoNotEquals1()
  2138. {
  2139. var query = from c in _collection.AsQueryable<C>()
  2140. where c.A[1] % 2 != 1
  2141. select c;
  2142. var translatedQuery = MongoQueryTranslator.Translate(query);
  2143. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2144. Assert.AreSame(_collection, translatedQuery.Collection);
  2145. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2146. var selectQuery = (SelectQuery)translatedQuery;
  2147. Assert.AreEqual("(C c) => ((c.A[1] % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2148. Assert.IsNull(selectQuery.OrderBy);
  2149. Assert.IsNull(selectQuery.Projection);
  2150. Assert.IsNull(selectQuery.Skip);
  2151. Assert.IsNull(selectQuery.Take);
  2152. Assert.AreEqual("{ \"a.1\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  2153. Assert.AreEqual(4, Consume(query));
  2154. }
  2155. [Test]
  2156. public void TestWhereASub1ModTwoNotEquals1Not()
  2157. {
  2158. var query = from c in _collection.AsQueryable<C>()
  2159. where !(c.A[1] % 2 != 1)
  2160. select c;
  2161. var translatedQuery = MongoQueryTranslator.Translate(query);
  2162. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2163. Assert.AreSame(_collection, translatedQuery.Collection);
  2164. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2165. var selectQuery = (SelectQuery)translatedQuery;
  2166. Assert.AreEqual("(C c) => !((c.A[1] % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2167. Assert.IsNull(selectQuery.OrderBy);
  2168. Assert.IsNull(selectQuery.Projection);
  2169. Assert.IsNull(selectQuery.Skip);
  2170. Assert.IsNull(selectQuery.Take);
  2171. Assert.AreEqual("{ \"a.1\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  2172. Assert.AreEqual(1, Consume(query));
  2173. }
  2174. [Test]
  2175. public void TestWhereASub1NotEquals3()
  2176. {
  2177. var query = from c in _collection.AsQueryable<C>()
  2178. where c.A[1] != 3
  2179. select c;
  2180. var translatedQuery = MongoQueryTranslator.Translate(query);
  2181. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2182. Assert.AreSame(_collection, translatedQuery.Collection);
  2183. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2184. var selectQuery = (SelectQuery)translatedQuery;
  2185. Assert.AreEqual("(C c) => (c.A[1] != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  2186. Assert.IsNull(selectQuery.OrderBy);
  2187. Assert.IsNull(selectQuery.Projection);
  2188. Assert.IsNull(selectQuery.Skip);
  2189. Assert.IsNull(selectQuery.Take);
  2190. Assert.AreEqual("{ \"a.1\" : { \"$ne\" : 3 } }", selectQuery.BuildQuery().ToJson());
  2191. Assert.AreEqual(4, Consume(query));
  2192. }
  2193. [Test]
  2194. public void TestWhereASub1NotEquals3Not()
  2195. {
  2196. var query = from c in _collection.AsQueryable<C>()
  2197. where !(c.A[1] != 3)
  2198. select c;
  2199. var translatedQuery = MongoQueryTranslator.Translate(query);
  2200. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2201. Assert.AreSame(_collection, translatedQuery.Collection);
  2202. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2203. var selectQuery = (SelectQuery)translatedQuery;
  2204. Assert.AreEqual("(C c) => !(c.A[1] != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  2205. Assert.IsNull(selectQuery.OrderBy);
  2206. Assert.IsNull(selectQuery.Projection);
  2207. Assert.IsNull(selectQuery.Skip);
  2208. Assert.IsNull(selectQuery.Take);
  2209. Assert.AreEqual("{ \"a.1\" : 3 }", selectQuery.BuildQuery().ToJson());
  2210. Assert.AreEqual(1, Consume(query));
  2211. }
  2212. [Test]
  2213. public void TestWhereB()
  2214. {
  2215. var query = from c in _collection.AsQueryable<C>()
  2216. where c.B
  2217. select c;
  2218. var translatedQuery = MongoQueryTranslator.Translate(query);
  2219. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2220. Assert.AreSame(_collection, translatedQuery.Collection);
  2221. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2222. var selectQuery = (SelectQuery)translatedQuery;
  2223. Assert.AreEqual("(C c) => c.B", ExpressionFormatter.ToString(selectQuery.Where));
  2224. Assert.IsNull(selectQuery.OrderBy);
  2225. Assert.IsNull(selectQuery.Projection);
  2226. Assert.IsNull(selectQuery.Skip);
  2227. Assert.IsNull(selectQuery.Take);
  2228. Assert.AreEqual("{ \"b\" : true }", selectQuery.BuildQuery().ToJson());
  2229. Assert.AreEqual(1, Consume(query));
  2230. }
  2231. [Test]
  2232. public void TestWhereBASub0()
  2233. {
  2234. var query = from c in _collection.AsQueryable<C>()
  2235. where c.BA[0]
  2236. select c;
  2237. var translatedQuery = MongoQueryTranslator.Translate(query);
  2238. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2239. Assert.AreSame(_collection, translatedQuery.Collection);
  2240. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2241. var selectQuery = (SelectQuery)translatedQuery;
  2242. Assert.AreEqual("(C c) => c.BA[0]", ExpressionFormatter.ToString(selectQuery.Where));
  2243. Assert.IsNull(selectQuery.OrderBy);
  2244. Assert.IsNull(selectQuery.Projection);
  2245. Assert.IsNull(selectQuery.Skip);
  2246. Assert.IsNull(selectQuery.Take);
  2247. Assert.AreEqual("{ \"ba.0\" : true }", selectQuery.BuildQuery().ToJson());
  2248. Assert.AreEqual(1, Consume(query));
  2249. }
  2250. [Test]
  2251. public void TestWhereBASub0EqualsFalse()
  2252. {
  2253. var query = from c in _collection.AsQueryable<C>()
  2254. where c.BA[0] == false
  2255. select c;
  2256. var translatedQuery = MongoQueryTranslator.Translate(query);
  2257. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2258. Assert.AreSame(_collection, translatedQuery.Collection);
  2259. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2260. var selectQuery = (SelectQuery)translatedQuery;
  2261. Assert.AreEqual("(C c) => (c.BA[0] == false)", ExpressionFormatter.ToString(selectQuery.Where));
  2262. Assert.IsNull(selectQuery.OrderBy);
  2263. Assert.IsNull(selectQuery.Projection);
  2264. Assert.IsNull(selectQuery.Skip);
  2265. Assert.IsNull(selectQuery.Take);
  2266. Assert.AreEqual("{ \"ba.0\" : false }", selectQuery.BuildQuery().ToJson());
  2267. Assert.AreEqual(0, Consume(query));
  2268. }
  2269. [Test]
  2270. public void TestWhereBASub0EqualsFalseNot()
  2271. {
  2272. var query = from c in _collection.AsQueryable<C>()
  2273. where !(c.BA[0] == false)
  2274. select c;
  2275. var translatedQuery = MongoQueryTranslator.Translate(query);
  2276. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2277. Assert.AreSame(_collection, translatedQuery.Collection);
  2278. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2279. var selectQuery = (SelectQuery)translatedQuery;
  2280. Assert.AreEqual("(C c) => !(c.BA[0] == false)", ExpressionFormatter.ToString(selectQuery.Where));
  2281. Assert.IsNull(selectQuery.OrderBy);
  2282. Assert.IsNull(selectQuery.Projection);
  2283. Assert.IsNull(selectQuery.Skip);
  2284. Assert.IsNull(selectQuery.Take);
  2285. Assert.AreEqual("{ \"ba.0\" : { \"$ne\" : false } }", selectQuery.BuildQuery().ToJson());
  2286. Assert.AreEqual(5, Consume(query));
  2287. }
  2288. [Test]
  2289. public void TestWhereBASub0EqualsTrue()
  2290. {
  2291. var query = from c in _collection.AsQueryable<C>()
  2292. where c.BA[0] == true
  2293. select c;
  2294. var translatedQuery = MongoQueryTranslator.Translate(query);
  2295. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2296. Assert.AreSame(_collection, translatedQuery.Collection);
  2297. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2298. var selectQuery = (SelectQuery)translatedQuery;
  2299. Assert.AreEqual("(C c) => (c.BA[0] == true)", ExpressionFormatter.ToString(selectQuery.Where));
  2300. Assert.IsNull(selectQuery.OrderBy);
  2301. Assert.IsNull(selectQuery.Projection);
  2302. Assert.IsNull(selectQuery.Skip);
  2303. Assert.IsNull(selectQuery.Take);
  2304. Assert.AreEqual("{ \"ba.0\" : true }", selectQuery.BuildQuery().ToJson());
  2305. Assert.AreEqual(1, Consume(query));
  2306. }
  2307. [Test]
  2308. public void TestWhereBASub0EqualsTrueNot()
  2309. {
  2310. var query = from c in _collection.AsQueryable<C>()
  2311. where !(c.BA[0] == true)
  2312. select c;
  2313. var translatedQuery = MongoQueryTranslator.Translate(query);
  2314. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2315. Assert.AreSame(_collection, translatedQuery.Collection);
  2316. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2317. var selectQuery = (SelectQuery)translatedQuery;
  2318. Assert.AreEqual("(C c) => !(c.BA[0] == true)", ExpressionFormatter.ToString(selectQuery.Where));
  2319. Assert.IsNull(selectQuery.OrderBy);
  2320. Assert.IsNull(selectQuery.Projection);
  2321. Assert.IsNull(selectQuery.Skip);
  2322. Assert.IsNull(selectQuery.Take);
  2323. Assert.AreEqual("{ \"ba.0\" : { \"$ne\" : true } }", selectQuery.BuildQuery().ToJson());
  2324. Assert.AreEqual(4, Consume(query));
  2325. }
  2326. [Test]
  2327. public void TestWhereBASub0Not()
  2328. {
  2329. var query = from c in _collection.AsQueryable<C>()
  2330. where !c.BA[0]
  2331. select c;
  2332. var translatedQuery = MongoQueryTranslator.Translate(query);
  2333. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2334. Assert.AreSame(_collection, translatedQuery.Collection);
  2335. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2336. var selectQuery = (SelectQuery)translatedQuery;
  2337. Assert.AreEqual("(C c) => !c.BA[0]", ExpressionFormatter.ToString(selectQuery.Where));
  2338. Assert.IsNull(selectQuery.OrderBy);
  2339. Assert.IsNull(selectQuery.Projection);
  2340. Assert.IsNull(selectQuery.Skip);
  2341. Assert.IsNull(selectQuery.Take);
  2342. Assert.AreEqual("{ \"ba.0\" : { \"$ne\" : true } }", selectQuery.BuildQuery().ToJson());
  2343. Assert.AreEqual(4, Consume(query));
  2344. }
  2345. [Test]
  2346. public void TestWhereBEqualsFalse()
  2347. {
  2348. var query = from c in _collection.AsQueryable<C>()
  2349. where c.B == false
  2350. select c;
  2351. var translatedQuery = MongoQueryTranslator.Translate(query);
  2352. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2353. Assert.AreSame(_collection, translatedQuery.Collection);
  2354. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2355. var selectQuery = (SelectQuery)translatedQuery;
  2356. Assert.AreEqual("(C c) => (c.B == false)", ExpressionFormatter.ToString(selectQuery.Where));
  2357. Assert.IsNull(selectQuery.OrderBy);
  2358. Assert.IsNull(selectQuery.Projection);
  2359. Assert.IsNull(selectQuery.Skip);
  2360. Assert.IsNull(selectQuery.Take);
  2361. Assert.AreEqual("{ \"b\" : false }", selectQuery.BuildQuery().ToJson());
  2362. Assert.AreEqual(4, Consume(query));
  2363. }
  2364. [Test]
  2365. public void TestWhereBEqualsFalseNot()
  2366. {
  2367. var query = from c in _collection.AsQueryable<C>()
  2368. where !(c.B == false)
  2369. select c;
  2370. var translatedQuery = MongoQueryTranslator.Translate(query);
  2371. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2372. Assert.AreSame(_collection, translatedQuery.Collection);
  2373. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2374. var selectQuery = (SelectQuery)translatedQuery;
  2375. Assert.AreEqual("(C c) => !(c.B == false)", ExpressionFormatter.ToString(selectQuery.Where));
  2376. Assert.IsNull(selectQuery.OrderBy);
  2377. Assert.IsNull(selectQuery.Projection);
  2378. Assert.IsNull(selectQuery.Skip);
  2379. Assert.IsNull(selectQuery.Take);
  2380. Assert.AreEqual("{ \"b\" : { \"$ne\" : false } }", selectQuery.BuildQuery().ToJson());
  2381. Assert.AreEqual(1, Consume(query));
  2382. }
  2383. [Test]
  2384. public void TestWhereBEqualsTrue()
  2385. {
  2386. var query = from c in _collection.AsQueryable<C>()
  2387. where c.B == true
  2388. select c;
  2389. var translatedQuery = MongoQueryTranslator.Translate(query);
  2390. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2391. Assert.AreSame(_collection, translatedQuery.Collection);
  2392. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2393. var selectQuery = (SelectQuery)translatedQuery;
  2394. Assert.AreEqual("(C c) => (c.B == true)", ExpressionFormatter.ToString(selectQuery.Where));
  2395. Assert.IsNull(selectQuery.OrderBy);
  2396. Assert.IsNull(selectQuery.Projection);
  2397. Assert.IsNull(selectQuery.Skip);
  2398. Assert.IsNull(selectQuery.Take);
  2399. Assert.AreEqual("{ \"b\" : true }", selectQuery.BuildQuery().ToJson());
  2400. Assert.AreEqual(1, Consume(query));
  2401. }
  2402. [Test]
  2403. public void TestWhereBEqualsTrueNot()
  2404. {
  2405. var query = from c in _collection.AsQueryable<C>()
  2406. where !(c.B == true)
  2407. select c;
  2408. var translatedQuery = MongoQueryTranslator.Translate(query);
  2409. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2410. Assert.AreSame(_collection, translatedQuery.Collection);
  2411. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2412. var selectQuery = (SelectQuery)translatedQuery;
  2413. Assert.AreEqual("(C c) => !(c.B == true)", ExpressionFormatter.ToString(selectQuery.Where));
  2414. Assert.IsNull(selectQuery.OrderBy);
  2415. Assert.IsNull(selectQuery.Projection);
  2416. Assert.IsNull(selectQuery.Skip);
  2417. Assert.IsNull(selectQuery.Take);
  2418. Assert.AreEqual("{ \"b\" : { \"$ne\" : true } }", selectQuery.BuildQuery().ToJson());
  2419. Assert.AreEqual(4, Consume(query));
  2420. }
  2421. [Test]
  2422. public void TestWhereBNot()
  2423. {
  2424. var query = from c in _collection.AsQueryable<C>()
  2425. where !c.B
  2426. select c;
  2427. var translatedQuery = MongoQueryTranslator.Translate(query);
  2428. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2429. Assert.AreSame(_collection, translatedQuery.Collection);
  2430. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2431. var selectQuery = (SelectQuery)translatedQuery;
  2432. Assert.AreEqual("(C c) => !c.B", ExpressionFormatter.ToString(selectQuery.Where));
  2433. Assert.IsNull(selectQuery.OrderBy);
  2434. Assert.IsNull(selectQuery.Projection);
  2435. Assert.IsNull(selectQuery.Skip);
  2436. Assert.IsNull(selectQuery.Take);
  2437. Assert.AreEqual("{ \"b\" : { \"$ne\" : true } }", selectQuery.BuildQuery().ToJson());
  2438. Assert.AreEqual(4, Consume(query));
  2439. }
  2440. [Test]
  2441. public void TestWhereDBRefCollectionNameEqualsC()
  2442. {
  2443. var query = from c in _collection.AsQueryable<C>()
  2444. where c.DBRef.CollectionName == "c"
  2445. select c;
  2446. var translatedQuery = MongoQueryTranslator.Translate(query);
  2447. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2448. Assert.AreSame(_collection, translatedQuery.Collection);
  2449. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2450. var selectQuery = (SelectQuery)translatedQuery;
  2451. Assert.AreEqual("(C c) => (c.DBRef.CollectionName == \"c\")", ExpressionFormatter.ToString(selectQuery.Where));
  2452. Assert.IsNull(selectQuery.OrderBy);
  2453. Assert.IsNull(selectQuery.Projection);
  2454. Assert.IsNull(selectQuery.Skip);
  2455. Assert.IsNull(selectQuery.Take);
  2456. Assert.AreEqual("{ \"dbref.$ref\" : \"c\" }", selectQuery.BuildQuery().ToJson());
  2457. Assert.AreEqual(1, Consume(query));
  2458. }
  2459. [Test]
  2460. public void TestWhereDBRefDatabaseNameEqualsDb()
  2461. {
  2462. var query = from c in _collection.AsQueryable<C>()
  2463. where c.DBRef.DatabaseName == "db"
  2464. select c;
  2465. var translatedQuery = MongoQueryTranslator.Translate(query);
  2466. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2467. Assert.AreSame(_collection, translatedQuery.Collection);
  2468. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2469. var selectQuery = (SelectQuery)translatedQuery;
  2470. Assert.AreEqual("(C c) => (c.DBRef.DatabaseName == \"db\")", ExpressionFormatter.ToString(selectQuery.Where));
  2471. Assert.IsNull(selectQuery.OrderBy);
  2472. Assert.IsNull(selectQuery.Projection);
  2473. Assert.IsNull(selectQuery.Skip);
  2474. Assert.IsNull(selectQuery.Take);
  2475. Assert.AreEqual("{ \"dbref.$db\" : \"db\" }", selectQuery.BuildQuery().ToJson());
  2476. Assert.AreEqual(1, Consume(query));
  2477. }
  2478. [Test]
  2479. public void TestWhereDBRefEquals()
  2480. {
  2481. var query = from c in _collection.AsQueryable<C>()
  2482. where c.DBRef == new MongoDBRef("db", "c", 1)
  2483. select c;
  2484. var translatedQuery = MongoQueryTranslator.Translate(query);
  2485. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2486. Assert.AreSame(_collection, translatedQuery.Collection);
  2487. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2488. var selectQuery = (SelectQuery)translatedQuery;
  2489. Assert.AreEqual("(C c) => (c.DBRef == new MongoDBRef(\"db\", \"c\", 1))", ExpressionFormatter.ToString(selectQuery.Where));
  2490. Assert.IsNull(selectQuery.OrderBy);
  2491. Assert.IsNull(selectQuery.Projection);
  2492. Assert.IsNull(selectQuery.Skip);
  2493. Assert.IsNull(selectQuery.Take);
  2494. Assert.AreEqual("{ \"dbref\" : { \"$ref\" : \"c\", \"$id\" : 1, \"$db\" : \"db\" } }", selectQuery.BuildQuery().ToJson());
  2495. Assert.AreEqual(1, Consume(query));
  2496. }
  2497. [Test]
  2498. public void TestWhereDBRefEqualsNot()
  2499. {
  2500. var query = from c in _collection.AsQueryable<C>()
  2501. where !(c.DBRef == new MongoDBRef("db", "c", 1))
  2502. select c;
  2503. var translatedQuery = MongoQueryTranslator.Translate(query);
  2504. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2505. Assert.AreSame(_collection, translatedQuery.Collection);
  2506. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2507. var selectQuery = (SelectQuery)translatedQuery;
  2508. Assert.AreEqual("(C c) => !(c.DBRef == new MongoDBRef(\"db\", \"c\", 1))", ExpressionFormatter.ToString(selectQuery.Where));
  2509. Assert.IsNull(selectQuery.OrderBy);
  2510. Assert.IsNull(selectQuery.Projection);
  2511. Assert.IsNull(selectQuery.Skip);
  2512. Assert.IsNull(selectQuery.Take);
  2513. Assert.AreEqual("{ \"dbref\" : { \"$ne\" : { \"$ref\" : \"c\", \"$id\" : 1, \"$db\" : \"db\" } } }", selectQuery.BuildQuery().ToJson());
  2514. Assert.AreEqual(4, Consume(query));
  2515. }
  2516. [Test]
  2517. public void TestWhereDBRefNotEquals()
  2518. {
  2519. var query = from c in _collection.AsQueryable<C>()
  2520. where c.DBRef != new MongoDBRef("db", "c", 1)
  2521. select c;
  2522. var translatedQuery = MongoQueryTranslator.Translate(query);
  2523. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2524. Assert.AreSame(_collection, translatedQuery.Collection);
  2525. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2526. var selectQuery = (SelectQuery)translatedQuery;
  2527. Assert.AreEqual("(C c) => (c.DBRef != new MongoDBRef(\"db\", \"c\", 1))", ExpressionFormatter.ToString(selectQuery.Where));
  2528. Assert.IsNull(selectQuery.OrderBy);
  2529. Assert.IsNull(selectQuery.Projection);
  2530. Assert.IsNull(selectQuery.Skip);
  2531. Assert.IsNull(selectQuery.Take);
  2532. Assert.AreEqual("{ \"dbref\" : { \"$ne\" : { \"$ref\" : \"c\", \"$id\" : 1, \"$db\" : \"db\" } } }", selectQuery.BuildQuery().ToJson());
  2533. Assert.AreEqual(4, Consume(query));
  2534. }
  2535. [Test]
  2536. public void TestWhereDBRefNotEqualsNot()
  2537. {
  2538. var query = from c in _collection.AsQueryable<C>()
  2539. where !(c.DBRef != new MongoDBRef("db", "c", 1))
  2540. select c;
  2541. var translatedQuery = MongoQueryTranslator.Translate(query);
  2542. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2543. Assert.AreSame(_collection, translatedQuery.Collection);
  2544. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2545. var selectQuery = (SelectQuery)translatedQuery;
  2546. Assert.AreEqual("(C c) => !(c.DBRef != new MongoDBRef(\"db\", \"c\", 1))", ExpressionFormatter.ToString(selectQuery.Where));
  2547. Assert.IsNull(selectQuery.OrderBy);
  2548. Assert.IsNull(selectQuery.Projection);
  2549. Assert.IsNull(selectQuery.Skip);
  2550. Assert.IsNull(selectQuery.Take);
  2551. Assert.AreEqual("{ \"dbref\" : { \"$ref\" : \"c\", \"$id\" : 1, \"$db\" : \"db\" } }", selectQuery.BuildQuery().ToJson());
  2552. Assert.AreEqual(1, Consume(query));
  2553. }
  2554. [Test]
  2555. public void TestWhereDBRefIdEquals1()
  2556. {
  2557. var query = from c in _collection.AsQueryable<C>()
  2558. where c.DBRef.Id == 1
  2559. select c;
  2560. var translatedQuery = MongoQueryTranslator.Translate(query);
  2561. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2562. Assert.AreSame(_collection, translatedQuery.Collection);
  2563. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2564. var selectQuery = (SelectQuery)translatedQuery;
  2565. Assert.AreEqual("(C c) => (c.DBRef.Id == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2566. Assert.IsNull(selectQuery.OrderBy);
  2567. Assert.IsNull(selectQuery.Projection);
  2568. Assert.IsNull(selectQuery.Skip);
  2569. Assert.IsNull(selectQuery.Take);
  2570. Assert.AreEqual("{ \"dbref.$id\" : 1 }", selectQuery.BuildQuery().ToJson());
  2571. Assert.AreEqual(1, Consume(query));
  2572. }
  2573. [Test]
  2574. public void TestWhereDEquals11()
  2575. {
  2576. var query = from c in _collection.AsQueryable<C>()
  2577. where c.D == new D { Z = 11 }
  2578. select c;
  2579. var translatedQuery = MongoQueryTranslator.Translate(query);
  2580. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2581. Assert.AreSame(_collection, translatedQuery.Collection);
  2582. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2583. var selectQuery = (SelectQuery)translatedQuery;
  2584. Assert.AreEqual("(C c) => (c.D == new D { Z = 11 })", ExpressionFormatter.ToString(selectQuery.Where));
  2585. Assert.IsNull(selectQuery.OrderBy);
  2586. Assert.IsNull(selectQuery.Projection);
  2587. Assert.IsNull(selectQuery.Skip);
  2588. Assert.IsNull(selectQuery.Take);
  2589. Assert.AreEqual("{ \"d\" : { \"z\" : 11 } }", selectQuery.BuildQuery().ToJson());
  2590. Assert.AreEqual(1, Consume(query));
  2591. }
  2592. [Test]
  2593. public void TestWhereDEquals11Not()
  2594. {
  2595. var query = from c in _collection.AsQueryable<C>()
  2596. where !(c.D == new D { Z = 11 })
  2597. select c;
  2598. var translatedQuery = MongoQueryTranslator.Translate(query);
  2599. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2600. Assert.AreSame(_collection, translatedQuery.Collection);
  2601. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2602. var selectQuery = (SelectQuery)translatedQuery;
  2603. Assert.AreEqual("(C c) => !(c.D == new D { Z = 11 })", ExpressionFormatter.ToString(selectQuery.Where));
  2604. Assert.IsNull(selectQuery.OrderBy);
  2605. Assert.IsNull(selectQuery.Projection);
  2606. Assert.IsNull(selectQuery.Skip);
  2607. Assert.IsNull(selectQuery.Take);
  2608. Assert.AreEqual("{ \"d\" : { \"$ne\" : { \"z\" : 11 } } }", selectQuery.BuildQuery().ToJson());
  2609. Assert.AreEqual(4, Consume(query));
  2610. }
  2611. [Test]
  2612. public void TestWhereDNotEquals11()
  2613. {
  2614. var query = from c in _collection.AsQueryable<C>()
  2615. where c.D != new D { Z = 11 }
  2616. select c;
  2617. var translatedQuery = MongoQueryTranslator.Translate(query);
  2618. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2619. Assert.AreSame(_collection, translatedQuery.Collection);
  2620. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2621. var selectQuery = (SelectQuery)translatedQuery;
  2622. Assert.AreEqual("(C c) => (c.D != new D { Z = 11 })", ExpressionFormatter.ToString(selectQuery.Where));
  2623. Assert.IsNull(selectQuery.OrderBy);
  2624. Assert.IsNull(selectQuery.Projection);
  2625. Assert.IsNull(selectQuery.Skip);
  2626. Assert.IsNull(selectQuery.Take);
  2627. Assert.AreEqual("{ \"d\" : { \"$ne\" : { \"z\" : 11 } } }", selectQuery.BuildQuery().ToJson());
  2628. Assert.AreEqual(4, Consume(query));
  2629. }
  2630. [Test]
  2631. public void TestWhereDNotEquals11Not()
  2632. {
  2633. var query = from c in _collection.AsQueryable<C>()
  2634. where !(c.D != new D { Z = 11 })
  2635. select c;
  2636. var translatedQuery = MongoQueryTranslator.Translate(query);
  2637. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2638. Assert.AreSame(_collection, translatedQuery.Collection);
  2639. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2640. var selectQuery = (SelectQuery)translatedQuery;
  2641. Assert.AreEqual("(C c) => !(c.D != new D { Z = 11 })", ExpressionFormatter.ToString(selectQuery.Where));
  2642. Assert.IsNull(selectQuery.OrderBy);
  2643. Assert.IsNull(selectQuery.Projection);
  2644. Assert.IsNull(selectQuery.Skip);
  2645. Assert.IsNull(selectQuery.Take);
  2646. Assert.AreEqual("{ \"d\" : { \"z\" : 11 } }", selectQuery.BuildQuery().ToJson());
  2647. Assert.AreEqual(1, Consume(query));
  2648. }
  2649. [Test]
  2650. public void TestWhereDAAnyWithPredicate()
  2651. {
  2652. var query = from c in _collection.AsQueryable<C>()
  2653. where c.DA.Any(d => d.Z == 333)
  2654. select c;
  2655. var translatedQuery = MongoQueryTranslator.Translate(query);
  2656. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2657. Assert.AreSame(_collection, translatedQuery.Collection);
  2658. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2659. var selectQuery = (SelectQuery)translatedQuery;
  2660. Assert.AreEqual("(C c) => Enumerable.Any<D>(c.DA, (D d) => (d.Z == 333))", ExpressionFormatter.ToString(selectQuery.Where));
  2661. Assert.IsNull(selectQuery.OrderBy);
  2662. Assert.IsNull(selectQuery.Projection);
  2663. Assert.IsNull(selectQuery.Skip);
  2664. Assert.IsNull(selectQuery.Take);
  2665. Assert.AreEqual("{ \"da\" : { \"$elemMatch\" : { \"z\" : 333 } } }", selectQuery.BuildQuery().ToJson());
  2666. Assert.AreEqual(1, Consume(query));
  2667. }
  2668. [Test]
  2669. public void TestWhereEAContainsAll()
  2670. {
  2671. var query = from c in _collection.AsQueryable<C>()
  2672. where c.EA.ContainsAll(new E[] { E.A, E.B})
  2673. select c;
  2674. var translatedQuery = MongoQueryTranslator.Translate(query);
  2675. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2676. Assert.AreSame(_collection, translatedQuery.Collection);
  2677. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2678. var selectQuery = (SelectQuery)translatedQuery;
  2679. Assert.AreEqual("(C c) => LinqToMongo.ContainsAll<E>(c.EA, E[]:{ E.A, E.B })", ExpressionFormatter.ToString(selectQuery.Where));
  2680. Assert.IsNull(selectQuery.OrderBy);
  2681. Assert.IsNull(selectQuery.Projection);
  2682. Assert.IsNull(selectQuery.Skip);
  2683. Assert.IsNull(selectQuery.Take);
  2684. Assert.AreEqual("{ \"ea\" : { \"$all\" : [1, 2] } }", selectQuery.BuildQuery().ToJson());
  2685. Assert.AreEqual(1, Consume(query));
  2686. }
  2687. [Test]
  2688. public void TestWhereEAContainsAllNot()
  2689. {
  2690. var query = from c in _collection.AsQueryable<C>()
  2691. where !c.EA.ContainsAll(new E[] { E.A, E.B })
  2692. select c;
  2693. var translatedQuery = MongoQueryTranslator.Translate(query);
  2694. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2695. Assert.AreSame(_collection, translatedQuery.Collection);
  2696. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2697. var selectQuery = (SelectQuery)translatedQuery;
  2698. Assert.AreEqual("(C c) => !LinqToMongo.ContainsAll<E>(c.EA, E[]:{ E.A, E.B })", ExpressionFormatter.ToString(selectQuery.Where));
  2699. Assert.IsNull(selectQuery.OrderBy);
  2700. Assert.IsNull(selectQuery.Projection);
  2701. Assert.IsNull(selectQuery.Skip);
  2702. Assert.IsNull(selectQuery.Take);
  2703. Assert.AreEqual("{ \"ea\" : { \"$not\" : { \"$all\" : [1, 2] } } }", selectQuery.BuildQuery().ToJson());
  2704. Assert.AreEqual(4, Consume(query));
  2705. }
  2706. [Test]
  2707. public void TestWhereEAContainsAny()
  2708. {
  2709. var query = from c in _collection.AsQueryable<C>()
  2710. where c.EA.ContainsAny(new[] { E.A, E.B })
  2711. select c;
  2712. var translatedQuery = MongoQueryTranslator.Translate(query);
  2713. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2714. Assert.AreSame(_collection, translatedQuery.Collection);
  2715. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2716. var selectQuery = (SelectQuery)translatedQuery;
  2717. Assert.AreEqual("(C c) => LinqToMongo.ContainsAny<E>(c.EA, E[]:{ E.A, E.B })", ExpressionFormatter.ToString(selectQuery.Where));
  2718. Assert.IsNull(selectQuery.OrderBy);
  2719. Assert.IsNull(selectQuery.Projection);
  2720. Assert.IsNull(selectQuery.Skip);
  2721. Assert.IsNull(selectQuery.Take);
  2722. Assert.AreEqual("{ \"ea\" : { \"$in\" : [1, 2] } }", selectQuery.BuildQuery().ToJson());
  2723. Assert.AreEqual(1, Consume(query));
  2724. }
  2725. [Test]
  2726. public void TestWhereEAContainsAnyNot()
  2727. {
  2728. var query = from c in _collection.AsQueryable<C>()
  2729. where !c.EA.ContainsAny(new[] { E.A, E.B })
  2730. select c;
  2731. var translatedQuery = MongoQueryTranslator.Translate(query);
  2732. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2733. Assert.AreSame(_collection, translatedQuery.Collection);
  2734. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2735. var selectQuery = (SelectQuery)translatedQuery;
  2736. Assert.AreEqual("(C c) => !LinqToMongo.ContainsAny<E>(c.EA, E[]:{ E.A, E.B })", ExpressionFormatter.ToString(selectQuery.Where));
  2737. Assert.IsNull(selectQuery.OrderBy);
  2738. Assert.IsNull(selectQuery.Projection);
  2739. Assert.IsNull(selectQuery.Skip);
  2740. Assert.IsNull(selectQuery.Take);
  2741. Assert.AreEqual("{ \"ea\" : { \"$nin\" : [1, 2] } }", selectQuery.BuildQuery().ToJson());
  2742. Assert.AreEqual(4, Consume(query));
  2743. }
  2744. [Test]
  2745. public void TestWhereEAContainsB()
  2746. {
  2747. var query = from c in _collection.AsQueryable<C>()
  2748. where c.EA.Contains(E.B)
  2749. select c;
  2750. var translatedQuery = MongoQueryTranslator.Translate(query);
  2751. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2752. Assert.AreSame(_collection, translatedQuery.Collection);
  2753. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2754. var selectQuery = (SelectQuery)translatedQuery;
  2755. Assert.AreEqual("(C c) => Enumerable.Contains<E>(c.EA, E.B)", ExpressionFormatter.ToString(selectQuery.Where));
  2756. Assert.IsNull(selectQuery.OrderBy);
  2757. Assert.IsNull(selectQuery.Projection);
  2758. Assert.IsNull(selectQuery.Skip);
  2759. Assert.IsNull(selectQuery.Take);
  2760. Assert.AreEqual("{ \"ea\" : 2 }", selectQuery.BuildQuery().ToJson());
  2761. Assert.AreEqual(1, Consume(query));
  2762. }
  2763. [Test]
  2764. public void TestWhereEAContainsBNot()
  2765. {
  2766. var query = from c in _collection.AsQueryable<C>()
  2767. where !c.EA.Contains(E.B)
  2768. select c;
  2769. var translatedQuery = MongoQueryTranslator.Translate(query);
  2770. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2771. Assert.AreSame(_collection, translatedQuery.Collection);
  2772. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2773. var selectQuery = (SelectQuery)translatedQuery;
  2774. Assert.AreEqual("(C c) => !Enumerable.Contains<E>(c.EA, E.B)", ExpressionFormatter.ToString(selectQuery.Where));
  2775. Assert.IsNull(selectQuery.OrderBy);
  2776. Assert.IsNull(selectQuery.Projection);
  2777. Assert.IsNull(selectQuery.Skip);
  2778. Assert.IsNull(selectQuery.Take);
  2779. Assert.AreEqual("{ \"ea\" : { \"$ne\" : 2 } }", selectQuery.BuildQuery().ToJson());
  2780. Assert.AreEqual(4, Consume(query));
  2781. }
  2782. [Test]
  2783. public void TestWhereEASub0EqualsA()
  2784. {
  2785. var query = from c in _collection.AsQueryable<C>()
  2786. where c.EA[0] == E.A
  2787. select c;
  2788. var translatedQuery = MongoQueryTranslator.Translate(query);
  2789. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2790. Assert.AreSame(_collection, translatedQuery.Collection);
  2791. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2792. var selectQuery = (SelectQuery)translatedQuery;
  2793. Assert.AreEqual("(C c) => ((Int32)c.EA[0] == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2794. Assert.IsNull(selectQuery.OrderBy);
  2795. Assert.IsNull(selectQuery.Projection);
  2796. Assert.IsNull(selectQuery.Skip);
  2797. Assert.IsNull(selectQuery.Take);
  2798. Assert.AreEqual("{ \"ea.0\" : 1 }", selectQuery.BuildQuery().ToJson());
  2799. Assert.AreEqual(1, Consume(query));
  2800. }
  2801. [Test]
  2802. public void TestWhereEASub0EqualsANot()
  2803. {
  2804. var query = from c in _collection.AsQueryable<C>()
  2805. where !(c.EA[0] == E.A)
  2806. select c;
  2807. var translatedQuery = MongoQueryTranslator.Translate(query);
  2808. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2809. Assert.AreSame(_collection, translatedQuery.Collection);
  2810. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2811. var selectQuery = (SelectQuery)translatedQuery;
  2812. Assert.AreEqual("(C c) => !((Int32)c.EA[0] == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2813. Assert.IsNull(selectQuery.OrderBy);
  2814. Assert.IsNull(selectQuery.Projection);
  2815. Assert.IsNull(selectQuery.Skip);
  2816. Assert.IsNull(selectQuery.Take);
  2817. Assert.AreEqual("{ \"ea.0\" : { \"$ne\" : 1 } }", selectQuery.BuildQuery().ToJson());
  2818. Assert.AreEqual(4, Consume(query));
  2819. }
  2820. [Test]
  2821. public void TestWhereEASub0NotEqualsA()
  2822. {
  2823. var query = from c in _collection.AsQueryable<C>()
  2824. where c.EA[0] != E.A
  2825. select c;
  2826. var translatedQuery = MongoQueryTranslator.Translate(query);
  2827. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2828. Assert.AreSame(_collection, translatedQuery.Collection);
  2829. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2830. var selectQuery = (SelectQuery)translatedQuery;
  2831. Assert.AreEqual("(C c) => ((Int32)c.EA[0] != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2832. Assert.IsNull(selectQuery.OrderBy);
  2833. Assert.IsNull(selectQuery.Projection);
  2834. Assert.IsNull(selectQuery.Skip);
  2835. Assert.IsNull(selectQuery.Take);
  2836. Assert.AreEqual("{ \"ea.0\" : { \"$ne\" : 1 } }", selectQuery.BuildQuery().ToJson());
  2837. Assert.AreEqual(4, Consume(query));
  2838. }
  2839. [Test]
  2840. public void TestWhereEASub0NotEqualsANot()
  2841. {
  2842. var query = from c in _collection.AsQueryable<C>()
  2843. where !(c.EA[0] != E.A)
  2844. select c;
  2845. var translatedQuery = MongoQueryTranslator.Translate(query);
  2846. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2847. Assert.AreSame(_collection, translatedQuery.Collection);
  2848. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2849. var selectQuery = (SelectQuery)translatedQuery;
  2850. Assert.AreEqual("(C c) => !((Int32)c.EA[0] != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2851. Assert.IsNull(selectQuery.OrderBy);
  2852. Assert.IsNull(selectQuery.Projection);
  2853. Assert.IsNull(selectQuery.Skip);
  2854. Assert.IsNull(selectQuery.Take);
  2855. Assert.AreEqual("{ \"ea.0\" : 1 }", selectQuery.BuildQuery().ToJson());
  2856. Assert.AreEqual(1, Consume(query));
  2857. }
  2858. [Test]
  2859. public void TestWhereEEqualsA()
  2860. {
  2861. var query = from c in _collection.AsQueryable<C>()
  2862. where c.E == E.A
  2863. select c;
  2864. var translatedQuery = MongoQueryTranslator.Translate(query);
  2865. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2866. Assert.AreSame(_collection, translatedQuery.Collection);
  2867. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2868. var selectQuery = (SelectQuery)translatedQuery;
  2869. Assert.AreEqual("(C c) => ((Int32)c.E == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2870. Assert.IsNull(selectQuery.OrderBy);
  2871. Assert.IsNull(selectQuery.Projection);
  2872. Assert.IsNull(selectQuery.Skip);
  2873. Assert.IsNull(selectQuery.Take);
  2874. Assert.AreEqual("{ \"e\" : \"A\" }", selectQuery.BuildQuery().ToJson());
  2875. Assert.AreEqual(1, Consume(query));
  2876. }
  2877. [Test]
  2878. public void TestWhereEEqualsANot()
  2879. {
  2880. var query = from c in _collection.AsQueryable<C>()
  2881. where !(c.E == E.A)
  2882. select c;
  2883. var translatedQuery = MongoQueryTranslator.Translate(query);
  2884. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2885. Assert.AreSame(_collection, translatedQuery.Collection);
  2886. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2887. var selectQuery = (SelectQuery)translatedQuery;
  2888. Assert.AreEqual("(C c) => !((Int32)c.E == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2889. Assert.IsNull(selectQuery.OrderBy);
  2890. Assert.IsNull(selectQuery.Projection);
  2891. Assert.IsNull(selectQuery.Skip);
  2892. Assert.IsNull(selectQuery.Take);
  2893. Assert.AreEqual("{ \"e\" : { \"$ne\" : \"A\" } }", selectQuery.BuildQuery().ToJson());
  2894. Assert.AreEqual(4, Consume(query));
  2895. }
  2896. [Test]
  2897. public void TestWhereEEqualsAReversed()
  2898. {
  2899. var query = from c in _collection.AsQueryable<C>()
  2900. where E.A == c.E
  2901. select c;
  2902. var translatedQuery = MongoQueryTranslator.Translate(query);
  2903. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2904. Assert.AreSame(_collection, translatedQuery.Collection);
  2905. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2906. var selectQuery = (SelectQuery)translatedQuery;
  2907. Assert.AreEqual("(C c) => ((Int32)c.E == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2908. Assert.IsNull(selectQuery.OrderBy);
  2909. Assert.IsNull(selectQuery.Projection);
  2910. Assert.IsNull(selectQuery.Skip);
  2911. Assert.IsNull(selectQuery.Take);
  2912. Assert.AreEqual("{ \"e\" : \"A\" }", selectQuery.BuildQuery().ToJson());
  2913. Assert.AreEqual(1, Consume(query));
  2914. }
  2915. [Test]
  2916. public void TestWhereEInAOrB()
  2917. {
  2918. var query = from c in _collection.AsQueryable<C>()
  2919. where c.E.In(new[] { E.A, E.B })
  2920. select c;
  2921. var translatedQuery = MongoQueryTranslator.Translate(query);
  2922. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2923. Assert.AreSame(_collection, translatedQuery.Collection);
  2924. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2925. var selectQuery = (SelectQuery)translatedQuery;
  2926. Assert.AreEqual("(C c) => LinqToMongo.In<E>(c.E, E[]:{ E.A, E.B })", ExpressionFormatter.ToString(selectQuery.Where));
  2927. Assert.IsNull(selectQuery.OrderBy);
  2928. Assert.IsNull(selectQuery.Projection);
  2929. Assert.IsNull(selectQuery.Skip);
  2930. Assert.IsNull(selectQuery.Take);
  2931. Assert.AreEqual("{ \"e\" : { \"$in\" : [\"A\", \"B\"] } }", selectQuery.BuildQuery().ToJson());
  2932. Assert.AreEqual(1, Consume(query));
  2933. }
  2934. [Test]
  2935. public void TestWhereEInAOrBNot()
  2936. {
  2937. var query = from c in _collection.AsQueryable<C>()
  2938. where !c.E.In(new[] { E.A, E.B })
  2939. select c;
  2940. var translatedQuery = MongoQueryTranslator.Translate(query);
  2941. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2942. Assert.AreSame(_collection, translatedQuery.Collection);
  2943. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2944. var selectQuery = (SelectQuery)translatedQuery;
  2945. Assert.AreEqual("(C c) => !LinqToMongo.In<E>(c.E, E[]:{ E.A, E.B })", ExpressionFormatter.ToString(selectQuery.Where));
  2946. Assert.IsNull(selectQuery.OrderBy);
  2947. Assert.IsNull(selectQuery.Projection);
  2948. Assert.IsNull(selectQuery.Skip);
  2949. Assert.IsNull(selectQuery.Take);
  2950. Assert.AreEqual("{ \"e\" : { \"$nin\" : [\"A\", \"B\"] } }", selectQuery.BuildQuery().ToJson());
  2951. Assert.AreEqual(4, Consume(query));
  2952. }
  2953. [Test]
  2954. public void TestWhereENotEqualsA()
  2955. {
  2956. var query = from c in _collection.AsQueryable<C>()
  2957. where c.E != E.A
  2958. select c;
  2959. var translatedQuery = MongoQueryTranslator.Translate(query);
  2960. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2961. Assert.AreSame(_collection, translatedQuery.Collection);
  2962. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2963. var selectQuery = (SelectQuery)translatedQuery;
  2964. Assert.AreEqual("(C c) => ((Int32)c.E != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2965. Assert.IsNull(selectQuery.OrderBy);
  2966. Assert.IsNull(selectQuery.Projection);
  2967. Assert.IsNull(selectQuery.Skip);
  2968. Assert.IsNull(selectQuery.Take);
  2969. Assert.AreEqual("{ \"e\" : { \"$ne\" : \"A\" } }", selectQuery.BuildQuery().ToJson());
  2970. Assert.AreEqual(4, Consume(query));
  2971. }
  2972. [Test]
  2973. public void TestWhereENotEqualsANot()
  2974. {
  2975. var query = from c in _collection.AsQueryable<C>()
  2976. where !(c.E != E.A)
  2977. select c;
  2978. var translatedQuery = MongoQueryTranslator.Translate(query);
  2979. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2980. Assert.AreSame(_collection, translatedQuery.Collection);
  2981. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  2982. var selectQuery = (SelectQuery)translatedQuery;
  2983. Assert.AreEqual("(C c) => !((Int32)c.E != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  2984. Assert.IsNull(selectQuery.OrderBy);
  2985. Assert.IsNull(selectQuery.Projection);
  2986. Assert.IsNull(selectQuery.Skip);
  2987. Assert.IsNull(selectQuery.Take);
  2988. Assert.AreEqual("{ \"e\" : \"A\" }", selectQuery.BuildQuery().ToJson());
  2989. Assert.AreEqual(1, Consume(query));
  2990. }
  2991. [Test]
  2992. public void TestWhereLContains2()
  2993. {
  2994. var query = from c in _collection.AsQueryable<C>()
  2995. where c.L.Contains(2)
  2996. select c;
  2997. var translatedQuery = MongoQueryTranslator.Translate(query);
  2998. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  2999. Assert.AreSame(_collection, translatedQuery.Collection);
  3000. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3001. var selectQuery = (SelectQuery)translatedQuery;
  3002. Assert.AreEqual("(C c) => c.L.Contains(2)", ExpressionFormatter.ToString(selectQuery.Where));
  3003. Assert.IsNull(selectQuery.OrderBy);
  3004. Assert.IsNull(selectQuery.Projection);
  3005. Assert.IsNull(selectQuery.Skip);
  3006. Assert.IsNull(selectQuery.Take);
  3007. Assert.AreEqual("{ \"l\" : 2 }", selectQuery.BuildQuery().ToJson());
  3008. Assert.AreEqual(1, Consume(query));
  3009. }
  3010. [Test]
  3011. public void TestWhereLContains2Not()
  3012. {
  3013. var query = from c in _collection.AsQueryable<C>()
  3014. where !c.L.Contains(2)
  3015. select c;
  3016. var translatedQuery = MongoQueryTranslator.Translate(query);
  3017. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3018. Assert.AreSame(_collection, translatedQuery.Collection);
  3019. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3020. var selectQuery = (SelectQuery)translatedQuery;
  3021. Assert.AreEqual("(C c) => !c.L.Contains(2)", ExpressionFormatter.ToString(selectQuery.Where));
  3022. Assert.IsNull(selectQuery.OrderBy);
  3023. Assert.IsNull(selectQuery.Projection);
  3024. Assert.IsNull(selectQuery.Skip);
  3025. Assert.IsNull(selectQuery.Take);
  3026. Assert.AreEqual("{ \"l\" : { \"$ne\" : 2 } }", selectQuery.BuildQuery().ToJson());
  3027. Assert.AreEqual(4, Consume(query));
  3028. }
  3029. [Test]
  3030. public void TestWhereLContainsAll()
  3031. {
  3032. var query = from c in _collection.AsQueryable<C>()
  3033. where c.L.ContainsAll(new[] { 2, 3 })
  3034. select c;
  3035. var translatedQuery = MongoQueryTranslator.Translate(query);
  3036. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3037. Assert.AreSame(_collection, translatedQuery.Collection);
  3038. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3039. var selectQuery = (SelectQuery)translatedQuery;
  3040. Assert.AreEqual("(C c) => LinqToMongo.ContainsAll<Int32>(c.L, Int32[]:{ 2, 3 })", ExpressionFormatter.ToString(selectQuery.Where));
  3041. Assert.IsNull(selectQuery.OrderBy);
  3042. Assert.IsNull(selectQuery.Projection);
  3043. Assert.IsNull(selectQuery.Skip);
  3044. Assert.IsNull(selectQuery.Take);
  3045. Assert.AreEqual("{ \"l\" : { \"$all\" : [2, 3] } }", selectQuery.BuildQuery().ToJson());
  3046. Assert.AreEqual(1, Consume(query));
  3047. }
  3048. [Test]
  3049. public void TestWhereLContainsAllNot()
  3050. {
  3051. var query = from c in _collection.AsQueryable<C>()
  3052. where !c.L.ContainsAll(new[] { 2, 3 })
  3053. select c;
  3054. var translatedQuery = MongoQueryTranslator.Translate(query);
  3055. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3056. Assert.AreSame(_collection, translatedQuery.Collection);
  3057. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3058. var selectQuery = (SelectQuery)translatedQuery;
  3059. Assert.AreEqual("(C c) => !LinqToMongo.ContainsAll<Int32>(c.L, Int32[]:{ 2, 3 })", ExpressionFormatter.ToString(selectQuery.Where));
  3060. Assert.IsNull(selectQuery.OrderBy);
  3061. Assert.IsNull(selectQuery.Projection);
  3062. Assert.IsNull(selectQuery.Skip);
  3063. Assert.IsNull(selectQuery.Take);
  3064. Assert.AreEqual("{ \"l\" : { \"$not\" : { \"$all\" : [2, 3] } } }", selectQuery.BuildQuery().ToJson());
  3065. Assert.AreEqual(4, Consume(query));
  3066. }
  3067. [Test]
  3068. public void TestWhereLContainsAny()
  3069. {
  3070. var query = from c in _collection.AsQueryable<C>()
  3071. where c.L.ContainsAny(new[] { 2, 3 })
  3072. select c;
  3073. var translatedQuery = MongoQueryTranslator.Translate(query);
  3074. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3075. Assert.AreSame(_collection, translatedQuery.Collection);
  3076. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3077. var selectQuery = (SelectQuery)translatedQuery;
  3078. Assert.AreEqual("(C c) => LinqToMongo.ContainsAny<Int32>(c.L, Int32[]:{ 2, 3 })", ExpressionFormatter.ToString(selectQuery.Where));
  3079. Assert.IsNull(selectQuery.OrderBy);
  3080. Assert.IsNull(selectQuery.Projection);
  3081. Assert.IsNull(selectQuery.Skip);
  3082. Assert.IsNull(selectQuery.Take);
  3083. Assert.AreEqual("{ \"l\" : { \"$in\" : [2, 3] } }", selectQuery.BuildQuery().ToJson());
  3084. Assert.AreEqual(1, Consume(query));
  3085. }
  3086. [Test]
  3087. public void TestWhereLContainsAnyNot()
  3088. {
  3089. var query = from c in _collection.AsQueryable<C>()
  3090. where !c.L.ContainsAny(new[] { 1, 2 })
  3091. select c;
  3092. var translatedQuery = MongoQueryTranslator.Translate(query);
  3093. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3094. Assert.AreSame(_collection, translatedQuery.Collection);
  3095. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3096. var selectQuery = (SelectQuery)translatedQuery;
  3097. Assert.AreEqual("(C c) => !LinqToMongo.ContainsAny<Int32>(c.L, Int32[]:{ 1, 2 })", ExpressionFormatter.ToString(selectQuery.Where));
  3098. Assert.IsNull(selectQuery.OrderBy);
  3099. Assert.IsNull(selectQuery.Projection);
  3100. Assert.IsNull(selectQuery.Skip);
  3101. Assert.IsNull(selectQuery.Take);
  3102. Assert.AreEqual("{ \"l\" : { \"$nin\" : [1, 2] } }", selectQuery.BuildQuery().ToJson());
  3103. Assert.AreEqual(4, Consume(query));
  3104. }
  3105. [Test]
  3106. public void TestWhereLExistsFalse()
  3107. {
  3108. var query = from c in _collection.AsQueryable<C>()
  3109. where Query.NotExists("l").Inject()
  3110. select c;
  3111. var translatedQuery = MongoQueryTranslator.Translate(query);
  3112. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3113. Assert.AreSame(_collection, translatedQuery.Collection);
  3114. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3115. var selectQuery = (SelectQuery)translatedQuery;
  3116. Assert.AreEqual("(C c) => LinqToMongo.Inject({ \"l\" : { \"$exists\" : false } })", ExpressionFormatter.ToString(selectQuery.Where));
  3117. Assert.IsNull(selectQuery.OrderBy);
  3118. Assert.IsNull(selectQuery.Projection);
  3119. Assert.IsNull(selectQuery.Skip);
  3120. Assert.IsNull(selectQuery.Take);
  3121. Assert.AreEqual("{ \"l\" : { \"$exists\" : false } }", selectQuery.BuildQuery().ToJson());
  3122. Assert.AreEqual(4, Consume(query));
  3123. }
  3124. [Test]
  3125. public void TestWhereLExistsTrue()
  3126. {
  3127. var query = from c in _collection.AsQueryable<C>()
  3128. where Query.Exists("l").Inject()
  3129. select c;
  3130. var translatedQuery = MongoQueryTranslator.Translate(query);
  3131. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3132. Assert.AreSame(_collection, translatedQuery.Collection);
  3133. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3134. var selectQuery = (SelectQuery)translatedQuery;
  3135. Assert.AreEqual("(C c) => LinqToMongo.Inject({ \"l\" : { \"$exists\" : true } })", ExpressionFormatter.ToString(selectQuery.Where));
  3136. Assert.IsNull(selectQuery.OrderBy);
  3137. Assert.IsNull(selectQuery.Projection);
  3138. Assert.IsNull(selectQuery.Skip);
  3139. Assert.IsNull(selectQuery.Take);
  3140. Assert.AreEqual("{ \"l\" : { \"$exists\" : true } }", selectQuery.BuildQuery().ToJson());
  3141. Assert.AreEqual(1, Consume(query));
  3142. }
  3143. [Test]
  3144. public void TestWhereLExistsTrueNot()
  3145. {
  3146. var query = from c in _collection.AsQueryable<C>()
  3147. where !Query.Exists("l").Inject()
  3148. select c;
  3149. var translatedQuery = MongoQueryTranslator.Translate(query);
  3150. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3151. Assert.AreSame(_collection, translatedQuery.Collection);
  3152. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3153. var selectQuery = (SelectQuery)translatedQuery;
  3154. Assert.AreEqual("(C c) => !LinqToMongo.Inject({ \"l\" : { \"$exists\" : true } })", ExpressionFormatter.ToString(selectQuery.Where));
  3155. Assert.IsNull(selectQuery.OrderBy);
  3156. Assert.IsNull(selectQuery.Projection);
  3157. Assert.IsNull(selectQuery.Skip);
  3158. Assert.IsNull(selectQuery.Take);
  3159. Assert.AreEqual("{ \"l\" : { \"$exists\" : false } }", selectQuery.BuildQuery().ToJson());
  3160. Assert.AreEqual(4, Consume(query));
  3161. }
  3162. [Test]
  3163. public void TestWhereLCountMethodEquals3()
  3164. {
  3165. var query = from c in _collection.AsQueryable<C>()
  3166. where c.L.Count() == 3
  3167. select c;
  3168. var translatedQuery = MongoQueryTranslator.Translate(query);
  3169. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3170. Assert.AreSame(_collection, translatedQuery.Collection);
  3171. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3172. var selectQuery = (SelectQuery)translatedQuery;
  3173. Assert.AreEqual("(C c) => (Enumerable.Count<Int32>(c.L) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3174. Assert.IsNull(selectQuery.OrderBy);
  3175. Assert.IsNull(selectQuery.Projection);
  3176. Assert.IsNull(selectQuery.Skip);
  3177. Assert.IsNull(selectQuery.Take);
  3178. Assert.AreEqual("{ \"l\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  3179. Assert.AreEqual(1, Consume(query));
  3180. }
  3181. [Test]
  3182. public void TestWhereLCountMethodEquals3Not()
  3183. {
  3184. var query = from c in _collection.AsQueryable<C>()
  3185. where !(c.L.Count() == 3)
  3186. select c;
  3187. var translatedQuery = MongoQueryTranslator.Translate(query);
  3188. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3189. Assert.AreSame(_collection, translatedQuery.Collection);
  3190. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3191. var selectQuery = (SelectQuery)translatedQuery;
  3192. Assert.AreEqual("(C c) => !(Enumerable.Count<Int32>(c.L) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3193. Assert.IsNull(selectQuery.OrderBy);
  3194. Assert.IsNull(selectQuery.Projection);
  3195. Assert.IsNull(selectQuery.Skip);
  3196. Assert.IsNull(selectQuery.Take);
  3197. Assert.AreEqual("{ \"l\" : { \"$not\" : { \"$size\" : 3 } } }", selectQuery.BuildQuery().ToJson());
  3198. Assert.AreEqual(4, Consume(query));
  3199. }
  3200. [Test]
  3201. public void TestWhereLCountMethodEquals3Reversed()
  3202. {
  3203. var query = from c in _collection.AsQueryable<C>()
  3204. where 3 == c.L.Count()
  3205. select c;
  3206. var translatedQuery = MongoQueryTranslator.Translate(query);
  3207. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3208. Assert.AreSame(_collection, translatedQuery.Collection);
  3209. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3210. var selectQuery = (SelectQuery)translatedQuery;
  3211. Assert.AreEqual("(C c) => (Enumerable.Count<Int32>(c.L) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3212. Assert.IsNull(selectQuery.OrderBy);
  3213. Assert.IsNull(selectQuery.Projection);
  3214. Assert.IsNull(selectQuery.Skip);
  3215. Assert.IsNull(selectQuery.Take);
  3216. Assert.AreEqual("{ \"l\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  3217. Assert.AreEqual(1, Consume(query));
  3218. }
  3219. [Test]
  3220. public void TestWhereLCountPropertyEquals3()
  3221. {
  3222. var query = from c in _collection.AsQueryable<C>()
  3223. where c.L.Count == 3
  3224. select c;
  3225. var translatedQuery = MongoQueryTranslator.Translate(query);
  3226. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3227. Assert.AreSame(_collection, translatedQuery.Collection);
  3228. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3229. var selectQuery = (SelectQuery)translatedQuery;
  3230. Assert.AreEqual("(C c) => (c.L.Count == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3231. Assert.IsNull(selectQuery.OrderBy);
  3232. Assert.IsNull(selectQuery.Projection);
  3233. Assert.IsNull(selectQuery.Skip);
  3234. Assert.IsNull(selectQuery.Take);
  3235. Assert.AreEqual("{ \"l\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  3236. Assert.AreEqual(1, Consume(query));
  3237. }
  3238. [Test]
  3239. public void TestWhereLCountPropertyEquals3Not()
  3240. {
  3241. var query = from c in _collection.AsQueryable<C>()
  3242. where !(c.L.Count == 3)
  3243. select c;
  3244. var translatedQuery = MongoQueryTranslator.Translate(query);
  3245. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3246. Assert.AreSame(_collection, translatedQuery.Collection);
  3247. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3248. var selectQuery = (SelectQuery)translatedQuery;
  3249. Assert.AreEqual("(C c) => !(c.L.Count == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3250. Assert.IsNull(selectQuery.OrderBy);
  3251. Assert.IsNull(selectQuery.Projection);
  3252. Assert.IsNull(selectQuery.Skip);
  3253. Assert.IsNull(selectQuery.Take);
  3254. Assert.AreEqual("{ \"l\" : { \"$not\" : { \"$size\" : 3 } } }", selectQuery.BuildQuery().ToJson());
  3255. Assert.AreEqual(4, Consume(query));
  3256. }
  3257. [Test]
  3258. public void TestWhereLCountPropertyEquals3Reversed()
  3259. {
  3260. var query = from c in _collection.AsQueryable<C>()
  3261. where 3 == c.L.Count
  3262. select c;
  3263. var translatedQuery = MongoQueryTranslator.Translate(query);
  3264. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3265. Assert.AreSame(_collection, translatedQuery.Collection);
  3266. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3267. var selectQuery = (SelectQuery)translatedQuery;
  3268. Assert.AreEqual("(C c) => (c.L.Count == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3269. Assert.IsNull(selectQuery.OrderBy);
  3270. Assert.IsNull(selectQuery.Projection);
  3271. Assert.IsNull(selectQuery.Skip);
  3272. Assert.IsNull(selectQuery.Take);
  3273. Assert.AreEqual("{ \"l\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  3274. Assert.AreEqual(1, Consume(query));
  3275. }
  3276. [Test]
  3277. public void TestWhereLCountPropertyNotEquals3()
  3278. {
  3279. var query = from c in _collection.AsQueryable<C>()
  3280. where c.L.Count != 3
  3281. select c;
  3282. var translatedQuery = MongoQueryTranslator.Translate(query);
  3283. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3284. Assert.AreSame(_collection, translatedQuery.Collection);
  3285. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3286. var selectQuery = (SelectQuery)translatedQuery;
  3287. Assert.AreEqual("(C c) => (c.L.Count != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3288. Assert.IsNull(selectQuery.OrderBy);
  3289. Assert.IsNull(selectQuery.Projection);
  3290. Assert.IsNull(selectQuery.Skip);
  3291. Assert.IsNull(selectQuery.Take);
  3292. Assert.AreEqual("{ \"l\" : { \"$not\" : { \"$size\" : 3 } } }", selectQuery.BuildQuery().ToJson());
  3293. Assert.AreEqual(4, Consume(query));
  3294. }
  3295. [Test]
  3296. public void TestWhereLCountPropertyNotEquals3Not()
  3297. {
  3298. var query = from c in _collection.AsQueryable<C>()
  3299. where !(c.L.Count != 3)
  3300. select c;
  3301. var translatedQuery = MongoQueryTranslator.Translate(query);
  3302. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3303. Assert.AreSame(_collection, translatedQuery.Collection);
  3304. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3305. var selectQuery = (SelectQuery)translatedQuery;
  3306. Assert.AreEqual("(C c) => !(c.L.Count != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3307. Assert.IsNull(selectQuery.OrderBy);
  3308. Assert.IsNull(selectQuery.Projection);
  3309. Assert.IsNull(selectQuery.Skip);
  3310. Assert.IsNull(selectQuery.Take);
  3311. Assert.AreEqual("{ \"l\" : { \"$size\" : 3 } }", selectQuery.BuildQuery().ToJson());
  3312. Assert.AreEqual(1, Consume(query));
  3313. }
  3314. [Test]
  3315. public void TestWhereLSub1Equals3()
  3316. {
  3317. var query = from c in _collection.AsQueryable<C>()
  3318. where c.L[1] == 3
  3319. select c;
  3320. var translatedQuery = MongoQueryTranslator.Translate(query);
  3321. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3322. Assert.AreSame(_collection, translatedQuery.Collection);
  3323. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3324. var selectQuery = (SelectQuery)translatedQuery;
  3325. Assert.AreEqual("(C c) => (c.L.get_Item(1) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3326. Assert.IsNull(selectQuery.OrderBy);
  3327. Assert.IsNull(selectQuery.Projection);
  3328. Assert.IsNull(selectQuery.Skip);
  3329. Assert.IsNull(selectQuery.Take);
  3330. Assert.AreEqual("{ \"l.1\" : 3 }", selectQuery.BuildQuery().ToJson());
  3331. Assert.AreEqual(1, Consume(query));
  3332. }
  3333. [Test]
  3334. public void TestWhereLSub1Equals3Not()
  3335. {
  3336. var query = from c in _collection.AsQueryable<C>()
  3337. where !(c.L[1] == 3)
  3338. select c;
  3339. var translatedQuery = MongoQueryTranslator.Translate(query);
  3340. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3341. Assert.AreSame(_collection, translatedQuery.Collection);
  3342. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3343. var selectQuery = (SelectQuery)translatedQuery;
  3344. Assert.AreEqual("(C c) => !(c.L.get_Item(1) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3345. Assert.IsNull(selectQuery.OrderBy);
  3346. Assert.IsNull(selectQuery.Projection);
  3347. Assert.IsNull(selectQuery.Skip);
  3348. Assert.IsNull(selectQuery.Take);
  3349. Assert.AreEqual("{ \"l.1\" : { \"$ne\" : 3 } }", selectQuery.BuildQuery().ToJson());
  3350. Assert.AreEqual(4, Consume(query));
  3351. }
  3352. [Test]
  3353. public void TestWhereLSub1ModTwoEquals1()
  3354. {
  3355. var query = from c in _collection.AsQueryable<C>()
  3356. where c.L[1] % 2 == 1
  3357. select c;
  3358. var translatedQuery = MongoQueryTranslator.Translate(query);
  3359. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3360. Assert.AreSame(_collection, translatedQuery.Collection);
  3361. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3362. var selectQuery = (SelectQuery)translatedQuery;
  3363. Assert.AreEqual("(C c) => ((c.L.get_Item(1) % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3364. Assert.IsNull(selectQuery.OrderBy);
  3365. Assert.IsNull(selectQuery.Projection);
  3366. Assert.IsNull(selectQuery.Skip);
  3367. Assert.IsNull(selectQuery.Take);
  3368. Assert.AreEqual("{ \"l.1\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  3369. Assert.AreEqual(1, Consume(query));
  3370. }
  3371. [Test]
  3372. public void TestWhereLSub1ModTwoEquals1Not()
  3373. {
  3374. var query = from c in _collection.AsQueryable<C>()
  3375. where !(c.L[1] % 2 == 1)
  3376. select c;
  3377. var translatedQuery = MongoQueryTranslator.Translate(query);
  3378. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3379. Assert.AreSame(_collection, translatedQuery.Collection);
  3380. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3381. var selectQuery = (SelectQuery)translatedQuery;
  3382. Assert.AreEqual("(C c) => !((c.L.get_Item(1) % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3383. Assert.IsNull(selectQuery.OrderBy);
  3384. Assert.IsNull(selectQuery.Projection);
  3385. Assert.IsNull(selectQuery.Skip);
  3386. Assert.IsNull(selectQuery.Take);
  3387. Assert.AreEqual("{ \"l.1\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  3388. Assert.AreEqual(4, Consume(query));
  3389. }
  3390. [Test]
  3391. public void TestWhereLSub1ModTwoNotEquals1()
  3392. {
  3393. var query = from c in _collection.AsQueryable<C>()
  3394. where c.L[1] % 2 != 1
  3395. select c;
  3396. var translatedQuery = MongoQueryTranslator.Translate(query);
  3397. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3398. Assert.AreSame(_collection, translatedQuery.Collection);
  3399. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3400. var selectQuery = (SelectQuery)translatedQuery;
  3401. Assert.AreEqual("(C c) => ((c.L.get_Item(1) % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3402. Assert.IsNull(selectQuery.OrderBy);
  3403. Assert.IsNull(selectQuery.Projection);
  3404. Assert.IsNull(selectQuery.Skip);
  3405. Assert.IsNull(selectQuery.Take);
  3406. Assert.AreEqual("{ \"l.1\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  3407. Assert.AreEqual(4, Consume(query));
  3408. }
  3409. [Test]
  3410. public void TestWhereLSub1ModTwoNotEquals1Not()
  3411. {
  3412. var query = from c in _collection.AsQueryable<C>()
  3413. where !(c.L[1] % 2 != 1)
  3414. select c;
  3415. var translatedQuery = MongoQueryTranslator.Translate(query);
  3416. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3417. Assert.AreSame(_collection, translatedQuery.Collection);
  3418. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3419. var selectQuery = (SelectQuery)translatedQuery;
  3420. Assert.AreEqual("(C c) => !((c.L.get_Item(1) % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3421. Assert.IsNull(selectQuery.OrderBy);
  3422. Assert.IsNull(selectQuery.Projection);
  3423. Assert.IsNull(selectQuery.Skip);
  3424. Assert.IsNull(selectQuery.Take);
  3425. Assert.AreEqual("{ \"l.1\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  3426. Assert.AreEqual(1, Consume(query));
  3427. }
  3428. [Test]
  3429. public void TestWhereLSub1NotEquals3()
  3430. {
  3431. var query = from c in _collection.AsQueryable<C>()
  3432. where c.L[1] != 3
  3433. select c;
  3434. var translatedQuery = MongoQueryTranslator.Translate(query);
  3435. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3436. Assert.AreSame(_collection, translatedQuery.Collection);
  3437. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3438. var selectQuery = (SelectQuery)translatedQuery;
  3439. Assert.AreEqual("(C c) => (c.L.get_Item(1) != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3440. Assert.IsNull(selectQuery.OrderBy);
  3441. Assert.IsNull(selectQuery.Projection);
  3442. Assert.IsNull(selectQuery.Skip);
  3443. Assert.IsNull(selectQuery.Take);
  3444. Assert.AreEqual("{ \"l.1\" : { \"$ne\" : 3 } }", selectQuery.BuildQuery().ToJson());
  3445. Assert.AreEqual(4, Consume(query));
  3446. }
  3447. [Test]
  3448. public void TestWhereLSub1NotEquals3Not()
  3449. {
  3450. var query = from c in _collection.AsQueryable<C>()
  3451. where !(c.L[1] != 3)
  3452. select c;
  3453. var translatedQuery = MongoQueryTranslator.Translate(query);
  3454. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3455. Assert.AreSame(_collection, translatedQuery.Collection);
  3456. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3457. var selectQuery = (SelectQuery)translatedQuery;
  3458. Assert.AreEqual("(C c) => !(c.L.get_Item(1) != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3459. Assert.IsNull(selectQuery.OrderBy);
  3460. Assert.IsNull(selectQuery.Projection);
  3461. Assert.IsNull(selectQuery.Skip);
  3462. Assert.IsNull(selectQuery.Take);
  3463. Assert.AreEqual("{ \"l.1\" : 3 }", selectQuery.BuildQuery().ToJson());
  3464. Assert.AreEqual(1, Consume(query));
  3465. }
  3466. [Test]
  3467. public void TestWhereLXModTwoEquals1()
  3468. {
  3469. var query = from c in _collection.AsQueryable<C>()
  3470. where c.LX % 2 == 1
  3471. select c;
  3472. var translatedQuery = MongoQueryTranslator.Translate(query);
  3473. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3474. Assert.AreSame(_collection, translatedQuery.Collection);
  3475. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3476. var selectQuery = (SelectQuery)translatedQuery;
  3477. Assert.AreEqual("(C c) => ((c.LX % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3478. Assert.IsNull(selectQuery.OrderBy);
  3479. Assert.IsNull(selectQuery.Projection);
  3480. Assert.IsNull(selectQuery.Skip);
  3481. Assert.IsNull(selectQuery.Take);
  3482. Assert.AreEqual("{ \"lx\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  3483. Assert.AreEqual(3, Consume(query));
  3484. }
  3485. [Test]
  3486. public void TestWhereLXModTwoEquals1Not()
  3487. {
  3488. var query = from c in _collection.AsQueryable<C>()
  3489. where !(c.LX % 2 == 1)
  3490. select c;
  3491. var translatedQuery = MongoQueryTranslator.Translate(query);
  3492. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3493. Assert.AreSame(_collection, translatedQuery.Collection);
  3494. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3495. var selectQuery = (SelectQuery)translatedQuery;
  3496. Assert.AreEqual("(C c) => !((c.LX % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3497. Assert.IsNull(selectQuery.OrderBy);
  3498. Assert.IsNull(selectQuery.Projection);
  3499. Assert.IsNull(selectQuery.Skip);
  3500. Assert.IsNull(selectQuery.Take);
  3501. Assert.AreEqual("{ \"lx\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  3502. Assert.AreEqual(2, Consume(query));
  3503. }
  3504. [Test]
  3505. public void TestWhereLXModTwoEquals1Reversed()
  3506. {
  3507. var query = from c in _collection.AsQueryable<C>()
  3508. where 1 == c.LX % 2
  3509. select c;
  3510. var translatedQuery = MongoQueryTranslator.Translate(query);
  3511. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3512. Assert.AreSame(_collection, translatedQuery.Collection);
  3513. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3514. var selectQuery = (SelectQuery)translatedQuery;
  3515. Assert.AreEqual("(C c) => ((c.LX % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3516. Assert.IsNull(selectQuery.OrderBy);
  3517. Assert.IsNull(selectQuery.Projection);
  3518. Assert.IsNull(selectQuery.Skip);
  3519. Assert.IsNull(selectQuery.Take);
  3520. Assert.AreEqual("{ \"lx\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  3521. Assert.AreEqual(3, Consume(query));
  3522. }
  3523. [Test]
  3524. public void TestWhereLXModTwoNotEquals1()
  3525. {
  3526. var query = from c in _collection.AsQueryable<C>()
  3527. where c.LX % 2 != 1
  3528. select c;
  3529. var translatedQuery = MongoQueryTranslator.Translate(query);
  3530. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3531. Assert.AreSame(_collection, translatedQuery.Collection);
  3532. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3533. var selectQuery = (SelectQuery)translatedQuery;
  3534. Assert.AreEqual("(C c) => ((c.LX % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3535. Assert.IsNull(selectQuery.OrderBy);
  3536. Assert.IsNull(selectQuery.Projection);
  3537. Assert.IsNull(selectQuery.Skip);
  3538. Assert.IsNull(selectQuery.Take);
  3539. Assert.AreEqual("{ \"lx\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  3540. Assert.AreEqual(2, Consume(query));
  3541. }
  3542. [Test]
  3543. public void TestWhereLXModTwoNotEquals1Not()
  3544. {
  3545. var query = from c in _collection.AsQueryable<C>()
  3546. where !(c.LX % 2 != 1)
  3547. select c;
  3548. var translatedQuery = MongoQueryTranslator.Translate(query);
  3549. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3550. Assert.AreSame(_collection, translatedQuery.Collection);
  3551. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3552. var selectQuery = (SelectQuery)translatedQuery;
  3553. Assert.AreEqual("(C c) => !((c.LX % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  3554. Assert.IsNull(selectQuery.OrderBy);
  3555. Assert.IsNull(selectQuery.Projection);
  3556. Assert.IsNull(selectQuery.Skip);
  3557. Assert.IsNull(selectQuery.Take);
  3558. Assert.AreEqual("{ \"lx\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  3559. Assert.AreEqual(3, Consume(query));
  3560. }
  3561. [Test]
  3562. public void TestWhereSASub0ContainsO()
  3563. {
  3564. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3565. {
  3566. var query = from c in _collection.AsQueryable<C>()
  3567. where c.SA[0].Contains("o")
  3568. select c;
  3569. var translatedQuery = MongoQueryTranslator.Translate(query);
  3570. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3571. Assert.AreSame(_collection, translatedQuery.Collection);
  3572. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3573. var selectQuery = (SelectQuery)translatedQuery;
  3574. Assert.AreEqual("(C c) => c.SA[0].Contains(\"o\")", ExpressionFormatter.ToString(selectQuery.Where));
  3575. Assert.IsNull(selectQuery.OrderBy);
  3576. Assert.IsNull(selectQuery.Projection);
  3577. Assert.IsNull(selectQuery.Skip);
  3578. Assert.IsNull(selectQuery.Take);
  3579. Assert.AreEqual("{ \"sa.0\" : /o/s }", selectQuery.BuildQuery().ToJson());
  3580. Assert.AreEqual(1, Consume(query));
  3581. }
  3582. }
  3583. [Test]
  3584. public void TestWhereSASub0ContainsONot()
  3585. {
  3586. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3587. {
  3588. var query = from c in _collection.AsQueryable<C>()
  3589. where !c.SA[0].Contains("o")
  3590. select c;
  3591. var translatedQuery = MongoQueryTranslator.Translate(query);
  3592. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3593. Assert.AreSame(_collection, translatedQuery.Collection);
  3594. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3595. var selectQuery = (SelectQuery)translatedQuery;
  3596. Assert.AreEqual("(C c) => !c.SA[0].Contains(\"o\")", ExpressionFormatter.ToString(selectQuery.Where));
  3597. Assert.IsNull(selectQuery.OrderBy);
  3598. Assert.IsNull(selectQuery.Projection);
  3599. Assert.IsNull(selectQuery.Skip);
  3600. Assert.IsNull(selectQuery.Take);
  3601. Assert.AreEqual("{ \"sa.0\" : { \"$not\" : /o/s } }", selectQuery.BuildQuery().ToJson());
  3602. Assert.AreEqual(4, Consume(query));
  3603. }
  3604. }
  3605. [Test]
  3606. public void TestWhereSASub0EndsWithM()
  3607. {
  3608. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3609. {
  3610. var query = from c in _collection.AsQueryable<C>()
  3611. where c.SA[0].EndsWith("m")
  3612. select c;
  3613. var translatedQuery = MongoQueryTranslator.Translate(query);
  3614. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3615. Assert.AreSame(_collection, translatedQuery.Collection);
  3616. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3617. var selectQuery = (SelectQuery)translatedQuery;
  3618. Assert.AreEqual("(C c) => c.SA[0].EndsWith(\"m\")", ExpressionFormatter.ToString(selectQuery.Where));
  3619. Assert.IsNull(selectQuery.OrderBy);
  3620. Assert.IsNull(selectQuery.Projection);
  3621. Assert.IsNull(selectQuery.Skip);
  3622. Assert.IsNull(selectQuery.Take);
  3623. Assert.AreEqual("{ \"sa.0\" : /m$/s }", selectQuery.BuildQuery().ToJson());
  3624. Assert.AreEqual(1, Consume(query));
  3625. }
  3626. }
  3627. [Test]
  3628. public void TestWhereSASub0EndsWithMNot()
  3629. {
  3630. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3631. {
  3632. var query = from c in _collection.AsQueryable<C>()
  3633. where !c.SA[0].EndsWith("m")
  3634. select c;
  3635. var translatedQuery = MongoQueryTranslator.Translate(query);
  3636. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3637. Assert.AreSame(_collection, translatedQuery.Collection);
  3638. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3639. var selectQuery = (SelectQuery)translatedQuery;
  3640. Assert.AreEqual("(C c) => !c.SA[0].EndsWith(\"m\")", ExpressionFormatter.ToString(selectQuery.Where));
  3641. Assert.IsNull(selectQuery.OrderBy);
  3642. Assert.IsNull(selectQuery.Projection);
  3643. Assert.IsNull(selectQuery.Skip);
  3644. Assert.IsNull(selectQuery.Take);
  3645. Assert.AreEqual("{ \"sa.0\" : { \"$not\" : /m$/s } }", selectQuery.BuildQuery().ToJson());
  3646. Assert.AreEqual(4, Consume(query));
  3647. }
  3648. }
  3649. [Test]
  3650. public void TestWhereSASub0IsMatch()
  3651. {
  3652. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3653. {
  3654. var regex = new Regex(@"^T");
  3655. var query = from c in _collection.AsQueryable<C>()
  3656. where regex.IsMatch(c.SA[0])
  3657. select c;
  3658. var translatedQuery = MongoQueryTranslator.Translate(query);
  3659. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3660. Assert.AreSame(_collection, translatedQuery.Collection);
  3661. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3662. var selectQuery = (SelectQuery)translatedQuery;
  3663. Assert.AreEqual("(C c) => Regex:(@\"^T\").IsMatch(c.SA[0])", ExpressionFormatter.ToString(selectQuery.Where));
  3664. Assert.IsNull(selectQuery.OrderBy);
  3665. Assert.IsNull(selectQuery.Projection);
  3666. Assert.IsNull(selectQuery.Skip);
  3667. Assert.IsNull(selectQuery.Take);
  3668. Assert.AreEqual("{ \"sa.0\" : /^T/ }", selectQuery.BuildQuery().ToJson());
  3669. Assert.AreEqual(1, Consume(query));
  3670. }
  3671. }
  3672. [Test]
  3673. public void TestWhereSASub0IsMatchNot()
  3674. {
  3675. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3676. {
  3677. var regex = new Regex(@"^T");
  3678. var query = from c in _collection.AsQueryable<C>()
  3679. where !regex.IsMatch(c.SA[0])
  3680. select c;
  3681. var translatedQuery = MongoQueryTranslator.Translate(query);
  3682. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3683. Assert.AreSame(_collection, translatedQuery.Collection);
  3684. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3685. var selectQuery = (SelectQuery)translatedQuery;
  3686. Assert.AreEqual("(C c) => !Regex:(@\"^T\").IsMatch(c.SA[0])", ExpressionFormatter.ToString(selectQuery.Where));
  3687. Assert.IsNull(selectQuery.OrderBy);
  3688. Assert.IsNull(selectQuery.Projection);
  3689. Assert.IsNull(selectQuery.Skip);
  3690. Assert.IsNull(selectQuery.Take);
  3691. Assert.AreEqual("{ \"sa.0\" : { \"$not\" : /^T/ } }", selectQuery.BuildQuery().ToJson());
  3692. Assert.AreEqual(4, Consume(query));
  3693. }
  3694. }
  3695. [Test]
  3696. public void TestWhereSASub0IsMatchStatic()
  3697. {
  3698. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3699. {
  3700. var query = from c in _collection.AsQueryable<C>()
  3701. where Regex.IsMatch(c.SA[0], "^T")
  3702. select c;
  3703. var translatedQuery = MongoQueryTranslator.Translate(query);
  3704. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3705. Assert.AreSame(_collection, translatedQuery.Collection);
  3706. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3707. var selectQuery = (SelectQuery)translatedQuery;
  3708. Assert.AreEqual("(C c) => Regex.IsMatch(c.SA[0], \"^T\")", ExpressionFormatter.ToString(selectQuery.Where));
  3709. Assert.IsNull(selectQuery.OrderBy);
  3710. Assert.IsNull(selectQuery.Projection);
  3711. Assert.IsNull(selectQuery.Skip);
  3712. Assert.IsNull(selectQuery.Take);
  3713. Assert.AreEqual("{ \"sa.0\" : /^T/ }", selectQuery.BuildQuery().ToJson());
  3714. Assert.AreEqual(1, Consume(query));
  3715. }
  3716. }
  3717. [Test]
  3718. public void TestWhereSASub0IsMatchStaticNot()
  3719. {
  3720. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3721. {
  3722. var query = from c in _collection.AsQueryable<C>()
  3723. where !Regex.IsMatch(c.SA[0], "^T")
  3724. select c;
  3725. var translatedQuery = MongoQueryTranslator.Translate(query);
  3726. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3727. Assert.AreSame(_collection, translatedQuery.Collection);
  3728. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3729. var selectQuery = (SelectQuery)translatedQuery;
  3730. Assert.AreEqual("(C c) => !Regex.IsMatch(c.SA[0], \"^T\")", ExpressionFormatter.ToString(selectQuery.Where));
  3731. Assert.IsNull(selectQuery.OrderBy);
  3732. Assert.IsNull(selectQuery.Projection);
  3733. Assert.IsNull(selectQuery.Skip);
  3734. Assert.IsNull(selectQuery.Take);
  3735. Assert.AreEqual("{ \"sa.0\" : { \"$not\" : /^T/ } }", selectQuery.BuildQuery().ToJson());
  3736. Assert.AreEqual(4, Consume(query));
  3737. }
  3738. }
  3739. [Test]
  3740. public void TestWhereSASub0IsMatchStaticWithOptions()
  3741. {
  3742. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3743. {
  3744. var query = from c in _collection.AsQueryable<C>()
  3745. where Regex.IsMatch(c.SA[0], "^t", RegexOptions.IgnoreCase)
  3746. select c;
  3747. var translatedQuery = MongoQueryTranslator.Translate(query);
  3748. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3749. Assert.AreSame(_collection, translatedQuery.Collection);
  3750. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3751. var selectQuery = (SelectQuery)translatedQuery;
  3752. Assert.AreEqual("(C c) => Regex.IsMatch(c.SA[0], \"^t\", RegexOptions.IgnoreCase)", ExpressionFormatter.ToString(selectQuery.Where));
  3753. Assert.IsNull(selectQuery.OrderBy);
  3754. Assert.IsNull(selectQuery.Projection);
  3755. Assert.IsNull(selectQuery.Skip);
  3756. Assert.IsNull(selectQuery.Take);
  3757. Assert.AreEqual("{ \"sa.0\" : /^t/i }", selectQuery.BuildQuery().ToJson());
  3758. Assert.AreEqual(1, Consume(query));
  3759. }
  3760. }
  3761. [Test]
  3762. public void TestWhereSASub0StartsWithT()
  3763. {
  3764. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3765. {
  3766. var query = from c in _collection.AsQueryable<C>()
  3767. where c.SA[0].StartsWith("T")
  3768. select c;
  3769. var translatedQuery = MongoQueryTranslator.Translate(query);
  3770. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3771. Assert.AreSame(_collection, translatedQuery.Collection);
  3772. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3773. var selectQuery = (SelectQuery)translatedQuery;
  3774. Assert.AreEqual("(C c) => c.SA[0].StartsWith(\"T\")", ExpressionFormatter.ToString(selectQuery.Where));
  3775. Assert.IsNull(selectQuery.OrderBy);
  3776. Assert.IsNull(selectQuery.Projection);
  3777. Assert.IsNull(selectQuery.Skip);
  3778. Assert.IsNull(selectQuery.Take);
  3779. Assert.AreEqual("{ \"sa.0\" : /^T/s }", selectQuery.BuildQuery().ToJson());
  3780. Assert.AreEqual(1, Consume(query));
  3781. }
  3782. }
  3783. [Test]
  3784. public void TestWhereSASub0StartsWithTNot()
  3785. {
  3786. if (_server.BuildInfo.Version >= new Version(1, 8, 0))
  3787. {
  3788. var query = from c in _collection.AsQueryable<C>()
  3789. where !c.SA[0].StartsWith("T")
  3790. select c;
  3791. var translatedQuery = MongoQueryTranslator.Translate(query);
  3792. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3793. Assert.AreSame(_collection, translatedQuery.Collection);
  3794. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3795. var selectQuery = (SelectQuery)translatedQuery;
  3796. Assert.AreEqual("(C c) => !c.SA[0].StartsWith(\"T\")", ExpressionFormatter.ToString(selectQuery.Where));
  3797. Assert.IsNull(selectQuery.OrderBy);
  3798. Assert.IsNull(selectQuery.Projection);
  3799. Assert.IsNull(selectQuery.Skip);
  3800. Assert.IsNull(selectQuery.Take);
  3801. Assert.AreEqual("{ \"sa.0\" : { \"$not\" : /^T/s } }", selectQuery.BuildQuery().ToJson());
  3802. Assert.AreEqual(4, Consume(query));
  3803. }
  3804. }
  3805. [Test]
  3806. public void TestWhereSContainsAbc()
  3807. {
  3808. var query = from c in _collection.AsQueryable<C>()
  3809. where c.S.Contains("abc")
  3810. select c;
  3811. var translatedQuery = MongoQueryTranslator.Translate(query);
  3812. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3813. Assert.AreSame(_collection, translatedQuery.Collection);
  3814. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3815. var selectQuery = (SelectQuery)translatedQuery;
  3816. Assert.AreEqual("(C c) => c.S.Contains(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3817. Assert.IsNull(selectQuery.OrderBy);
  3818. Assert.IsNull(selectQuery.Projection);
  3819. Assert.IsNull(selectQuery.Skip);
  3820. Assert.IsNull(selectQuery.Take);
  3821. Assert.AreEqual("{ \"s\" : /abc/s }", selectQuery.BuildQuery().ToJson());
  3822. Assert.AreEqual(1, Consume(query));
  3823. }
  3824. [Test]
  3825. public void TestWhereSContainsAbcNot()
  3826. {
  3827. var query = from c in _collection.AsQueryable<C>()
  3828. where !c.S.Contains("abc")
  3829. select c;
  3830. var translatedQuery = MongoQueryTranslator.Translate(query);
  3831. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3832. Assert.AreSame(_collection, translatedQuery.Collection);
  3833. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3834. var selectQuery = (SelectQuery)translatedQuery;
  3835. Assert.AreEqual("(C c) => !c.S.Contains(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3836. Assert.IsNull(selectQuery.OrderBy);
  3837. Assert.IsNull(selectQuery.Projection);
  3838. Assert.IsNull(selectQuery.Skip);
  3839. Assert.IsNull(selectQuery.Take);
  3840. Assert.AreEqual("{ \"s\" : { \"$not\" : /abc/s } }", selectQuery.BuildQuery().ToJson());
  3841. Assert.AreEqual(4, Consume(query));
  3842. }
  3843. [Test]
  3844. public void TestWhereSContainsDot()
  3845. {
  3846. var query = from c in _collection.AsQueryable<C>()
  3847. where c.S.Contains(".")
  3848. select c;
  3849. var translatedQuery = MongoQueryTranslator.Translate(query);
  3850. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3851. Assert.AreSame(_collection, translatedQuery.Collection);
  3852. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3853. var selectQuery = (SelectQuery)translatedQuery;
  3854. Assert.AreEqual("(C c) => c.S.Contains(\".\")", ExpressionFormatter.ToString(selectQuery.Where));
  3855. Assert.IsNull(selectQuery.OrderBy);
  3856. Assert.IsNull(selectQuery.Projection);
  3857. Assert.IsNull(selectQuery.Skip);
  3858. Assert.IsNull(selectQuery.Take);
  3859. Assert.AreEqual("{ \"s\" : /\\./s }", selectQuery.BuildQuery().ToJson());
  3860. Assert.AreEqual(0, Consume(query));
  3861. }
  3862. [Test]
  3863. public void TestWhereSCountEquals3()
  3864. {
  3865. var query = from c in _collection.AsQueryable<C>()
  3866. where c.S.Count() == 3
  3867. select c;
  3868. var translatedQuery = MongoQueryTranslator.Translate(query);
  3869. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3870. Assert.AreSame(_collection, translatedQuery.Collection);
  3871. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3872. var selectQuery = (SelectQuery)translatedQuery;
  3873. Assert.AreEqual("(C c) => (Enumerable.Count<Char>(c.S) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  3874. Assert.IsNull(selectQuery.OrderBy);
  3875. Assert.IsNull(selectQuery.Projection);
  3876. Assert.IsNull(selectQuery.Skip);
  3877. Assert.IsNull(selectQuery.Take);
  3878. Assert.AreEqual("{ \"s\" : /^.{3}$/s }", selectQuery.BuildQuery().ToJson());
  3879. Assert.AreEqual(1, Consume(query));
  3880. }
  3881. [Test]
  3882. public void TestWhereSEqualsAbc()
  3883. {
  3884. var query = from c in _collection.AsQueryable<C>()
  3885. where c.S == "abc"
  3886. select c;
  3887. var translatedQuery = MongoQueryTranslator.Translate(query);
  3888. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3889. Assert.AreSame(_collection, translatedQuery.Collection);
  3890. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3891. var selectQuery = (SelectQuery)translatedQuery;
  3892. Assert.AreEqual("(C c) => (c.S == \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3893. Assert.IsNull(selectQuery.OrderBy);
  3894. Assert.IsNull(selectQuery.Projection);
  3895. Assert.IsNull(selectQuery.Skip);
  3896. Assert.IsNull(selectQuery.Take);
  3897. Assert.AreEqual("{ \"s\" : \"abc\" }", selectQuery.BuildQuery().ToJson());
  3898. Assert.AreEqual(1, Consume(query));
  3899. }
  3900. [Test]
  3901. public void TestWhereSEqualsAbcNot()
  3902. {
  3903. var query = from c in _collection.AsQueryable<C>()
  3904. where !(c.S == "abc")
  3905. select c;
  3906. var translatedQuery = MongoQueryTranslator.Translate(query);
  3907. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3908. Assert.AreSame(_collection, translatedQuery.Collection);
  3909. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3910. var selectQuery = (SelectQuery)translatedQuery;
  3911. Assert.AreEqual("(C c) => !(c.S == \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3912. Assert.IsNull(selectQuery.OrderBy);
  3913. Assert.IsNull(selectQuery.Projection);
  3914. Assert.IsNull(selectQuery.Skip);
  3915. Assert.IsNull(selectQuery.Take);
  3916. Assert.AreEqual("{ \"s\" : { \"$ne\" : \"abc\" } }", selectQuery.BuildQuery().ToJson());
  3917. Assert.AreEqual(4, Consume(query));
  3918. }
  3919. [Test]
  3920. public void TestWhereSEqualsMethodAbc()
  3921. {
  3922. var query = from c in _collection.AsQueryable<C>()
  3923. where c.S.Equals("abc")
  3924. select c;
  3925. var translatedQuery = MongoQueryTranslator.Translate(query);
  3926. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3927. Assert.AreSame(_collection, translatedQuery.Collection);
  3928. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3929. var selectQuery = (SelectQuery)translatedQuery;
  3930. Assert.AreEqual("(C c) => c.S.Equals(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3931. Assert.IsNull(selectQuery.OrderBy);
  3932. Assert.IsNull(selectQuery.Projection);
  3933. Assert.IsNull(selectQuery.Skip);
  3934. Assert.IsNull(selectQuery.Take);
  3935. Assert.AreEqual("{ \"s\" : \"abc\" }", selectQuery.BuildQuery().ToJson());
  3936. Assert.AreEqual(1, Consume(query));
  3937. }
  3938. [Test]
  3939. public void TestWhereSEqualsMethodAbcNot()
  3940. {
  3941. var query = from c in _collection.AsQueryable<C>()
  3942. where !(c.S.Equals("abc"))
  3943. select c;
  3944. var translatedQuery = MongoQueryTranslator.Translate(query);
  3945. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3946. Assert.AreSame(_collection, translatedQuery.Collection);
  3947. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3948. var selectQuery = (SelectQuery)translatedQuery;
  3949. Assert.AreEqual("(C c) => !c.S.Equals(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3950. Assert.IsNull(selectQuery.OrderBy);
  3951. Assert.IsNull(selectQuery.Projection);
  3952. Assert.IsNull(selectQuery.Skip);
  3953. Assert.IsNull(selectQuery.Take);
  3954. Assert.AreEqual("{ \"s\" : { \"$ne\" : \"abc\" } }", selectQuery.BuildQuery().ToJson());
  3955. Assert.AreEqual(4, Consume(query));
  3956. }
  3957. [Test]
  3958. public void TestWhereSEqualsStaticMethodAbc()
  3959. {
  3960. var query = from c in _collection.AsQueryable<C>()
  3961. where string.Equals(c.S, "abc")
  3962. select c;
  3963. var translatedQuery = MongoQueryTranslator.Translate(query);
  3964. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3965. Assert.AreSame(_collection, translatedQuery.Collection);
  3966. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3967. var selectQuery = (SelectQuery)translatedQuery;
  3968. Assert.AreEqual("(C c) => String.Equals(c.S, \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3969. Assert.IsNull(selectQuery.OrderBy);
  3970. Assert.IsNull(selectQuery.Projection);
  3971. Assert.IsNull(selectQuery.Skip);
  3972. Assert.IsNull(selectQuery.Take);
  3973. Assert.AreEqual("{ \"s\" : \"abc\" }", selectQuery.BuildQuery().ToJson());
  3974. Assert.AreEqual(1, Consume(query));
  3975. }
  3976. [Test]
  3977. public void TestWhereSEqualsStaticMethodAbcNot()
  3978. {
  3979. var query = from c in _collection.AsQueryable<C>()
  3980. where !string.Equals(c.S, "abc")
  3981. select c;
  3982. var translatedQuery = MongoQueryTranslator.Translate(query);
  3983. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  3984. Assert.AreSame(_collection, translatedQuery.Collection);
  3985. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  3986. var selectQuery = (SelectQuery)translatedQuery;
  3987. Assert.AreEqual("(C c) => !String.Equals(c.S, \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  3988. Assert.IsNull(selectQuery.OrderBy);
  3989. Assert.IsNull(selectQuery.Projection);
  3990. Assert.IsNull(selectQuery.Skip);
  3991. Assert.IsNull(selectQuery.Take);
  3992. Assert.AreEqual("{ \"s\" : { \"$ne\" : \"abc\" } }", selectQuery.BuildQuery().ToJson());
  3993. Assert.AreEqual(4, Consume(query));
  3994. }
  3995. [Test]
  3996. public void TestWhereSEndsWithAbc()
  3997. {
  3998. var query = from c in _collection.AsQueryable<C>()
  3999. where c.S.EndsWith("abc")
  4000. select c;
  4001. var translatedQuery = MongoQueryTranslator.Translate(query);
  4002. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4003. Assert.AreSame(_collection, translatedQuery.Collection);
  4004. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4005. var selectQuery = (SelectQuery)translatedQuery;
  4006. Assert.AreEqual("(C c) => c.S.EndsWith(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4007. Assert.IsNull(selectQuery.OrderBy);
  4008. Assert.IsNull(selectQuery.Projection);
  4009. Assert.IsNull(selectQuery.Skip);
  4010. Assert.IsNull(selectQuery.Take);
  4011. Assert.AreEqual("{ \"s\" : /abc$/s }", selectQuery.BuildQuery().ToJson());
  4012. Assert.AreEqual(1, Consume(query));
  4013. }
  4014. [Test]
  4015. public void TestWhereSEndsWithAbcNot()
  4016. {
  4017. var query = from c in _collection.AsQueryable<C>()
  4018. where !c.S.EndsWith("abc")
  4019. select c;
  4020. var translatedQuery = MongoQueryTranslator.Translate(query);
  4021. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4022. Assert.AreSame(_collection, translatedQuery.Collection);
  4023. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4024. var selectQuery = (SelectQuery)translatedQuery;
  4025. Assert.AreEqual("(C c) => !c.S.EndsWith(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4026. Assert.IsNull(selectQuery.OrderBy);
  4027. Assert.IsNull(selectQuery.Projection);
  4028. Assert.IsNull(selectQuery.Skip);
  4029. Assert.IsNull(selectQuery.Take);
  4030. Assert.AreEqual("{ \"s\" : { \"$not\" : /abc$/s } }", selectQuery.BuildQuery().ToJson());
  4031. Assert.AreEqual(4, Consume(query));
  4032. }
  4033. [Test]
  4034. public void TestWhereSIndexOfAnyBC()
  4035. {
  4036. var tempCollection = _database.GetCollection("temp");
  4037. tempCollection.Drop();
  4038. tempCollection.Insert(new C { S = "bxxx" });
  4039. tempCollection.Insert(new C { S = "xbxx" });
  4040. tempCollection.Insert(new C { S = "xxbx" });
  4041. tempCollection.Insert(new C { S = "xxxb" });
  4042. tempCollection.Insert(new C { S = "bxbx" });
  4043. tempCollection.Insert(new C { S = "xbbx" });
  4044. tempCollection.Insert(new C { S = "xxbb" });
  4045. var query1 =
  4046. from c in tempCollection.AsQueryable<C>()
  4047. where c.S.IndexOfAny(new char[] { 'b', 'c' }) == 2
  4048. select c;
  4049. Assert.AreEqual(2, Consume(query1));
  4050. var query2 =
  4051. from c in tempCollection.AsQueryable<C>()
  4052. where c.S.IndexOfAny(new char[] { 'b', 'c' }, 1) == 2
  4053. select c;
  4054. Assert.AreEqual(3, Consume(query2));
  4055. var query3 =
  4056. from c in tempCollection.AsQueryable<C>()
  4057. where c.S.IndexOfAny(new char[] { 'b', 'c' }, 1, 1) == 2
  4058. select c;
  4059. Assert.AreEqual(0, Consume(query3));
  4060. var query4 =
  4061. from c in tempCollection.AsQueryable<C>()
  4062. where c.S.IndexOfAny(new char[] { 'b', 'c' }, 1, 2) == 2
  4063. select c;
  4064. Assert.AreEqual(3, Consume(query4));
  4065. }
  4066. [Test]
  4067. public void TestWhereSIndexOfAnyBDashCEquals1()
  4068. {
  4069. var query = from c in _collection.AsQueryable<C>()
  4070. where c.S.IndexOfAny(new char[] { 'b', '-', 'c' }) == 1
  4071. select c;
  4072. var translatedQuery = MongoQueryTranslator.Translate(query);
  4073. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4074. Assert.AreSame(_collection, translatedQuery.Collection);
  4075. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4076. var selectQuery = (SelectQuery)translatedQuery;
  4077. Assert.AreEqual("(C c) => (c.S.IndexOfAny(Char[]:{ 'b', '-', 'c' }) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  4078. Assert.IsNull(selectQuery.OrderBy);
  4079. Assert.IsNull(selectQuery.Projection);
  4080. Assert.IsNull(selectQuery.Skip);
  4081. Assert.IsNull(selectQuery.Take);
  4082. Assert.AreEqual("{ \"s\" : /^[^b\\-c]{1}[b\\-c]/s }", selectQuery.BuildQuery().ToJson());
  4083. Assert.AreEqual(1, Consume(query));
  4084. }
  4085. [Test]
  4086. public void TestWhereSIndexOfAnyBCStartIndex1Equals1()
  4087. {
  4088. var query = from c in _collection.AsQueryable<C>()
  4089. where c.S.IndexOfAny(new char[] { 'b', '-', 'c' }, 1) == 1
  4090. select c;
  4091. var translatedQuery = MongoQueryTranslator.Translate(query);
  4092. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4093. Assert.AreSame(_collection, translatedQuery.Collection);
  4094. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4095. var selectQuery = (SelectQuery)translatedQuery;
  4096. Assert.AreEqual("(C c) => (c.S.IndexOfAny(Char[]:{ 'b', '-', 'c' }, 1) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  4097. Assert.IsNull(selectQuery.OrderBy);
  4098. Assert.IsNull(selectQuery.Projection);
  4099. Assert.IsNull(selectQuery.Skip);
  4100. Assert.IsNull(selectQuery.Take);
  4101. Assert.AreEqual("{ \"s\" : /^.{1}[^b\\-c]{0}[b\\-c]/s }", selectQuery.BuildQuery().ToJson());
  4102. Assert.AreEqual(1, Consume(query));
  4103. }
  4104. [Test]
  4105. public void TestWhereSIndexOfAnyBCStartIndex1Count2Equals1()
  4106. {
  4107. var query = from c in _collection.AsQueryable<C>()
  4108. where c.S.IndexOfAny(new char[] { 'b', '-', 'c' }, 1, 2) == 1
  4109. select c;
  4110. var translatedQuery = MongoQueryTranslator.Translate(query);
  4111. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4112. Assert.AreSame(_collection, translatedQuery.Collection);
  4113. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4114. var selectQuery = (SelectQuery)translatedQuery;
  4115. Assert.AreEqual("(C c) => (c.S.IndexOfAny(Char[]:{ 'b', '-', 'c' }, 1, 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  4116. Assert.IsNull(selectQuery.OrderBy);
  4117. Assert.IsNull(selectQuery.Projection);
  4118. Assert.IsNull(selectQuery.Skip);
  4119. Assert.IsNull(selectQuery.Take);
  4120. Assert.AreEqual("{ \"s\" : /^.{1}(?=.{2})[^b\\-c]{0}[b\\-c]/s }", selectQuery.BuildQuery().ToJson());
  4121. Assert.AreEqual(1, Consume(query));
  4122. }
  4123. [Test]
  4124. public void TestWhereSIndexOfB()
  4125. {
  4126. var tempCollection = _database.GetCollection("temp");
  4127. tempCollection.Drop();
  4128. tempCollection.Insert(new C { S = "bxxx" });
  4129. tempCollection.Insert(new C { S = "xbxx" });
  4130. tempCollection.Insert(new C { S = "xxbx" });
  4131. tempCollection.Insert(new C { S = "xxxb" });
  4132. tempCollection.Insert(new C { S = "bxbx" });
  4133. tempCollection.Insert(new C { S = "xbbx" });
  4134. tempCollection.Insert(new C { S = "xxbb" });
  4135. var query1 =
  4136. from c in tempCollection.AsQueryable<C>()
  4137. where c.S.IndexOf('b') == 2
  4138. select c;
  4139. Assert.AreEqual(2, Consume(query1));
  4140. var query2 =
  4141. from c in tempCollection.AsQueryable<C>()
  4142. where c.S.IndexOf('b', 1) == 2
  4143. select c;
  4144. Assert.AreEqual(3, Consume(query2));
  4145. var query3 =
  4146. from c in tempCollection.AsQueryable<C>()
  4147. where c.S.IndexOf('b', 1, 1) == 2
  4148. select c;
  4149. Assert.AreEqual(0, Consume(query3));
  4150. var query4 =
  4151. from c in tempCollection.AsQueryable<C>()
  4152. where c.S.IndexOf('b', 1, 2) == 2
  4153. select c;
  4154. Assert.AreEqual(3, Consume(query4));
  4155. }
  4156. [Test]
  4157. public void TestWhereSIndexOfBEquals1()
  4158. {
  4159. var query = from c in _collection.AsQueryable<C>()
  4160. where c.S.IndexOf('b') == 1
  4161. select c;
  4162. var translatedQuery = MongoQueryTranslator.Translate(query);
  4163. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4164. Assert.AreSame(_collection, translatedQuery.Collection);
  4165. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4166. var selectQuery = (SelectQuery)translatedQuery;
  4167. Assert.AreEqual("(C c) => (c.S.IndexOf('b') == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  4168. Assert.IsNull(selectQuery.OrderBy);
  4169. Assert.IsNull(selectQuery.Projection);
  4170. Assert.IsNull(selectQuery.Skip);
  4171. Assert.IsNull(selectQuery.Take);
  4172. Assert.AreEqual("{ \"s\" : /^[^b]{1}b/s }", selectQuery.BuildQuery().ToJson());
  4173. Assert.AreEqual(1, Consume(query));
  4174. }
  4175. [Test]
  4176. public void TestWhereSIndexOfBStartIndex1Equals1()
  4177. {
  4178. var query = from c in _collection.AsQueryable<C>()
  4179. where c.S.IndexOf('b', 1) == 1
  4180. select c;
  4181. var translatedQuery = MongoQueryTranslator.Translate(query);
  4182. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4183. Assert.AreSame(_collection, translatedQuery.Collection);
  4184. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4185. var selectQuery = (SelectQuery)translatedQuery;
  4186. Assert.AreEqual("(C c) => (c.S.IndexOf('b', 1) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  4187. Assert.IsNull(selectQuery.OrderBy);
  4188. Assert.IsNull(selectQuery.Projection);
  4189. Assert.IsNull(selectQuery.Skip);
  4190. Assert.IsNull(selectQuery.Take);
  4191. Assert.AreEqual("{ \"s\" : /^.{1}[^b]{0}b/s }", selectQuery.BuildQuery().ToJson());
  4192. Assert.AreEqual(1, Consume(query));
  4193. }
  4194. [Test]
  4195. public void TestWhereSIndexOfBStartIndex1Count2Equals1()
  4196. {
  4197. var query = from c in _collection.AsQueryable<C>()
  4198. where c.S.IndexOf('b', 1, 2) == 1
  4199. select c;
  4200. var translatedQuery = MongoQueryTranslator.Translate(query);
  4201. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4202. Assert.AreSame(_collection, translatedQuery.Collection);
  4203. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4204. var selectQuery = (SelectQuery)translatedQuery;
  4205. Assert.AreEqual("(C c) => (c.S.IndexOf('b', 1, 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  4206. Assert.IsNull(selectQuery.OrderBy);
  4207. Assert.IsNull(selectQuery.Projection);
  4208. Assert.IsNull(selectQuery.Skip);
  4209. Assert.IsNull(selectQuery.Take);
  4210. Assert.AreEqual("{ \"s\" : /^.{1}(?=.{2})[^b]{0}b/s }", selectQuery.BuildQuery().ToJson());
  4211. Assert.AreEqual(1, Consume(query));
  4212. }
  4213. [Test]
  4214. public void TestWhereSIndexOfXyz()
  4215. {
  4216. var tempCollection = _database.GetCollection("temp");
  4217. tempCollection.Drop();
  4218. tempCollection.Insert(new C { S = "xyzaaa" });
  4219. tempCollection.Insert(new C { S = "axyzaa" });
  4220. tempCollection.Insert(new C { S = "aaxyza" });
  4221. tempCollection.Insert(new C { S = "aaaxyz" });
  4222. tempCollection.Insert(new C { S = "aaaaxy" });
  4223. tempCollection.Insert(new C { S = "xyzxyz" });
  4224. var query1 =
  4225. from c in tempCollection.AsQueryable<C>()
  4226. where c.S.IndexOf("xyz") == 3
  4227. select c;
  4228. Assert.AreEqual(1, Consume(query1));
  4229. var query2 =
  4230. from c in tempCollection.AsQueryable<C>()
  4231. where c.S.IndexOf("xyz", 1) == 3
  4232. select c;
  4233. Assert.AreEqual(2, Consume(query2));
  4234. var query3 =
  4235. from c in tempCollection.AsQueryable<C>()
  4236. where c.S.IndexOf("xyz", 1, 4) == 3
  4237. select c;
  4238. Assert.AreEqual(0, Consume(query3)); // substring isn't long enough to match
  4239. var query4 =
  4240. from c in tempCollection.AsQueryable<C>()
  4241. where c.S.IndexOf("xyz", 1, 5) == 3
  4242. select c;
  4243. Assert.AreEqual(2, Consume(query4));
  4244. }
  4245. [Test]
  4246. public void TestWhereSIndexOfXyzEquals3()
  4247. {
  4248. var query = from c in _collection.AsQueryable<C>()
  4249. where c.S.IndexOf("xyz") == 3
  4250. select c;
  4251. var translatedQuery = MongoQueryTranslator.Translate(query);
  4252. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4253. Assert.AreSame(_collection, translatedQuery.Collection);
  4254. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4255. var selectQuery = (SelectQuery)translatedQuery;
  4256. Assert.AreEqual("(C c) => (c.S.IndexOf(\"xyz\") == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4257. Assert.IsNull(selectQuery.OrderBy);
  4258. Assert.IsNull(selectQuery.Projection);
  4259. Assert.IsNull(selectQuery.Skip);
  4260. Assert.IsNull(selectQuery.Take);
  4261. Assert.AreEqual("{ \"s\" : /^(?!.{0,2}xyz).{3}xyz/s }", selectQuery.BuildQuery().ToJson());
  4262. Assert.AreEqual(1, Consume(query));
  4263. }
  4264. [Test]
  4265. public void TestWhereSIndexOfXyzStartIndex1Equals3()
  4266. {
  4267. var query = from c in _collection.AsQueryable<C>()
  4268. where c.S.IndexOf("xyz", 1) == 3
  4269. select c;
  4270. var translatedQuery = MongoQueryTranslator.Translate(query);
  4271. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4272. Assert.AreSame(_collection, translatedQuery.Collection);
  4273. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4274. var selectQuery = (SelectQuery)translatedQuery;
  4275. Assert.AreEqual("(C c) => (c.S.IndexOf(\"xyz\", 1) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4276. Assert.IsNull(selectQuery.OrderBy);
  4277. Assert.IsNull(selectQuery.Projection);
  4278. Assert.IsNull(selectQuery.Skip);
  4279. Assert.IsNull(selectQuery.Take);
  4280. Assert.AreEqual("{ \"s\" : /^.{1}(?!.{0,1}xyz).{2}xyz/s }", selectQuery.BuildQuery().ToJson());
  4281. Assert.AreEqual(1, Consume(query));
  4282. }
  4283. [Test]
  4284. public void TestWhereSIndexOfXyzStartIndex1Count5Equals3()
  4285. {
  4286. var query = from c in _collection.AsQueryable<C>()
  4287. where c.S.IndexOf("xyz", 1, 5) == 3
  4288. select c;
  4289. var translatedQuery = MongoQueryTranslator.Translate(query);
  4290. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4291. Assert.AreSame(_collection, translatedQuery.Collection);
  4292. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4293. var selectQuery = (SelectQuery)translatedQuery;
  4294. Assert.AreEqual("(C c) => (c.S.IndexOf(\"xyz\", 1, 5) == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4295. Assert.IsNull(selectQuery.OrderBy);
  4296. Assert.IsNull(selectQuery.Projection);
  4297. Assert.IsNull(selectQuery.Skip);
  4298. Assert.IsNull(selectQuery.Take);
  4299. Assert.AreEqual("{ \"s\" : /^.{1}(?=.{5})(?!.{0,1}xyz).{2}xyz/s }", selectQuery.BuildQuery().ToJson());
  4300. Assert.AreEqual(1, Consume(query));
  4301. }
  4302. [Test]
  4303. public void TestWhereSIsMatch()
  4304. {
  4305. var regex = new Regex(@"^abc");
  4306. var query = from c in _collection.AsQueryable<C>()
  4307. where regex.IsMatch(c.S)
  4308. select c;
  4309. var translatedQuery = MongoQueryTranslator.Translate(query);
  4310. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4311. Assert.AreSame(_collection, translatedQuery.Collection);
  4312. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4313. var selectQuery = (SelectQuery)translatedQuery;
  4314. Assert.AreEqual("(C c) => Regex:(@\"^abc\").IsMatch(c.S)", ExpressionFormatter.ToString(selectQuery.Where));
  4315. Assert.IsNull(selectQuery.OrderBy);
  4316. Assert.IsNull(selectQuery.Projection);
  4317. Assert.IsNull(selectQuery.Skip);
  4318. Assert.IsNull(selectQuery.Take);
  4319. Assert.AreEqual("{ \"s\" : /^abc/ }", selectQuery.BuildQuery().ToJson());
  4320. Assert.AreEqual(1, Consume(query));
  4321. }
  4322. [Test]
  4323. public void TestWhereSIsMatchNot()
  4324. {
  4325. var regex = new Regex(@"^abc");
  4326. var query = from c in _collection.AsQueryable<C>()
  4327. where !regex.IsMatch(c.S)
  4328. select c;
  4329. var translatedQuery = MongoQueryTranslator.Translate(query);
  4330. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4331. Assert.AreSame(_collection, translatedQuery.Collection);
  4332. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4333. var selectQuery = (SelectQuery)translatedQuery;
  4334. Assert.AreEqual("(C c) => !Regex:(@\"^abc\").IsMatch(c.S)", ExpressionFormatter.ToString(selectQuery.Where));
  4335. Assert.IsNull(selectQuery.OrderBy);
  4336. Assert.IsNull(selectQuery.Projection);
  4337. Assert.IsNull(selectQuery.Skip);
  4338. Assert.IsNull(selectQuery.Take);
  4339. Assert.AreEqual("{ \"s\" : { \"$not\" : /^abc/ } }", selectQuery.BuildQuery().ToJson());
  4340. Assert.AreEqual(4, Consume(query));
  4341. }
  4342. [Test]
  4343. public void TestWhereSIsMatchStatic()
  4344. {
  4345. var query = from c in _collection.AsQueryable<C>()
  4346. where Regex.IsMatch(c.S, "^abc")
  4347. select c;
  4348. var translatedQuery = MongoQueryTranslator.Translate(query);
  4349. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4350. Assert.AreSame(_collection, translatedQuery.Collection);
  4351. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4352. var selectQuery = (SelectQuery)translatedQuery;
  4353. Assert.AreEqual("(C c) => Regex.IsMatch(c.S, \"^abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4354. Assert.IsNull(selectQuery.OrderBy);
  4355. Assert.IsNull(selectQuery.Projection);
  4356. Assert.IsNull(selectQuery.Skip);
  4357. Assert.IsNull(selectQuery.Take);
  4358. Assert.AreEqual("{ \"s\" : /^abc/ }", selectQuery.BuildQuery().ToJson());
  4359. Assert.AreEqual(1, Consume(query));
  4360. }
  4361. [Test]
  4362. public void TestWhereSIsMatchStaticNot()
  4363. {
  4364. var query = from c in _collection.AsQueryable<C>()
  4365. where !Regex.IsMatch(c.S, "^abc")
  4366. select c;
  4367. var translatedQuery = MongoQueryTranslator.Translate(query);
  4368. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4369. Assert.AreSame(_collection, translatedQuery.Collection);
  4370. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4371. var selectQuery = (SelectQuery)translatedQuery;
  4372. Assert.AreEqual("(C c) => !Regex.IsMatch(c.S, \"^abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4373. Assert.IsNull(selectQuery.OrderBy);
  4374. Assert.IsNull(selectQuery.Projection);
  4375. Assert.IsNull(selectQuery.Skip);
  4376. Assert.IsNull(selectQuery.Take);
  4377. Assert.AreEqual("{ \"s\" : { \"$not\" : /^abc/ } }", selectQuery.BuildQuery().ToJson());
  4378. Assert.AreEqual(4, Consume(query));
  4379. }
  4380. [Test]
  4381. public void TestWhereSIsMatchStaticWithOptions()
  4382. {
  4383. var query = from c in _collection.AsQueryable<C>()
  4384. where Regex.IsMatch(c.S, "^abc", RegexOptions.IgnoreCase)
  4385. select c;
  4386. var translatedQuery = MongoQueryTranslator.Translate(query);
  4387. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4388. Assert.AreSame(_collection, translatedQuery.Collection);
  4389. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4390. var selectQuery = (SelectQuery)translatedQuery;
  4391. Assert.AreEqual("(C c) => Regex.IsMatch(c.S, \"^abc\", RegexOptions.IgnoreCase)", ExpressionFormatter.ToString(selectQuery.Where));
  4392. Assert.IsNull(selectQuery.OrderBy);
  4393. Assert.IsNull(selectQuery.Projection);
  4394. Assert.IsNull(selectQuery.Skip);
  4395. Assert.IsNull(selectQuery.Take);
  4396. Assert.AreEqual("{ \"s\" : /^abc/i }", selectQuery.BuildQuery().ToJson());
  4397. Assert.AreEqual(1, Consume(query));
  4398. }
  4399. [Test]
  4400. public void TestWhereSIsNullOrEmpty()
  4401. {
  4402. var tempCollection = _database.GetCollection("temp");
  4403. tempCollection.Drop();
  4404. tempCollection.Insert(new C()); // serialized document will have no "s" field
  4405. tempCollection.Insert(new BsonDocument("s", BsonNull.Value)); // work around [BsonIgnoreIfNull] on S
  4406. tempCollection.Insert(new C { S = "" });
  4407. tempCollection.Insert(new C { S = "x" });
  4408. var query = from c in tempCollection.AsQueryable<C>()
  4409. where string.IsNullOrEmpty(c.S)
  4410. select c;
  4411. var translatedQuery = MongoQueryTranslator.Translate(query);
  4412. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4413. Assert.AreSame(tempCollection, translatedQuery.Collection);
  4414. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4415. var selectQuery = (SelectQuery)translatedQuery;
  4416. Assert.AreEqual("(C c) => String.IsNullOrEmpty(c.S)", ExpressionFormatter.ToString(selectQuery.Where));
  4417. Assert.IsNull(selectQuery.OrderBy);
  4418. Assert.IsNull(selectQuery.Projection);
  4419. Assert.IsNull(selectQuery.Skip);
  4420. Assert.IsNull(selectQuery.Take);
  4421. Assert.AreEqual("{ \"$or\" : [{ \"s\" : { \"$type\" : 10 } }, { \"s\" : \"\" }] }", selectQuery.BuildQuery().ToJson());
  4422. Assert.AreEqual(2, Consume(query));
  4423. }
  4424. [Test]
  4425. public void TestWhereSLengthEquals3()
  4426. {
  4427. var query = from c in _collection.AsQueryable<C>()
  4428. where c.S.Length == 3
  4429. select c;
  4430. var translatedQuery = MongoQueryTranslator.Translate(query);
  4431. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4432. Assert.AreSame(_collection, translatedQuery.Collection);
  4433. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4434. var selectQuery = (SelectQuery)translatedQuery;
  4435. Assert.AreEqual("(C c) => (c.S.Length == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4436. Assert.IsNull(selectQuery.OrderBy);
  4437. Assert.IsNull(selectQuery.Projection);
  4438. Assert.IsNull(selectQuery.Skip);
  4439. Assert.IsNull(selectQuery.Take);
  4440. Assert.AreEqual("{ \"s\" : /^.{3}$/s }", selectQuery.BuildQuery().ToJson());
  4441. Assert.AreEqual(1, Consume(query));
  4442. }
  4443. [Test]
  4444. public void TestWhereSLengthEquals3Not()
  4445. {
  4446. var query = from c in _collection.AsQueryable<C>()
  4447. where !(c.S.Length == 3)
  4448. select c;
  4449. var translatedQuery = MongoQueryTranslator.Translate(query);
  4450. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4451. Assert.AreSame(_collection, translatedQuery.Collection);
  4452. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4453. var selectQuery = (SelectQuery)translatedQuery;
  4454. Assert.AreEqual("(C c) => !(c.S.Length == 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4455. Assert.IsNull(selectQuery.OrderBy);
  4456. Assert.IsNull(selectQuery.Projection);
  4457. Assert.IsNull(selectQuery.Skip);
  4458. Assert.IsNull(selectQuery.Take);
  4459. Assert.AreEqual("{ \"s\" : { \"$not\" : /^.{3}$/s } }", selectQuery.BuildQuery().ToJson());
  4460. Assert.AreEqual(4, Consume(query));
  4461. }
  4462. [Test]
  4463. public void TestWhereSLengthGreaterThan3()
  4464. {
  4465. var query = from c in _collection.AsQueryable<C>()
  4466. where c.S.Length > 3
  4467. select c;
  4468. var translatedQuery = MongoQueryTranslator.Translate(query);
  4469. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4470. Assert.AreSame(_collection, translatedQuery.Collection);
  4471. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4472. var selectQuery = (SelectQuery)translatedQuery;
  4473. Assert.AreEqual("(C c) => (c.S.Length > 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4474. Assert.IsNull(selectQuery.OrderBy);
  4475. Assert.IsNull(selectQuery.Projection);
  4476. Assert.IsNull(selectQuery.Skip);
  4477. Assert.IsNull(selectQuery.Take);
  4478. Assert.AreEqual("{ \"s\" : /^.{4,}$/s }", selectQuery.BuildQuery().ToJson());
  4479. Assert.AreEqual(1, Consume(query));
  4480. }
  4481. [Test]
  4482. public void TestWhereSLengthGreaterThanOrEquals3()
  4483. {
  4484. var query = from c in _collection.AsQueryable<C>()
  4485. where c.S.Length >= 3
  4486. select c;
  4487. var translatedQuery = MongoQueryTranslator.Translate(query);
  4488. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4489. Assert.AreSame(_collection, translatedQuery.Collection);
  4490. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4491. var selectQuery = (SelectQuery)translatedQuery;
  4492. Assert.AreEqual("(C c) => (c.S.Length >= 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4493. Assert.IsNull(selectQuery.OrderBy);
  4494. Assert.IsNull(selectQuery.Projection);
  4495. Assert.IsNull(selectQuery.Skip);
  4496. Assert.IsNull(selectQuery.Take);
  4497. Assert.AreEqual("{ \"s\" : /^.{3,}$/s }", selectQuery.BuildQuery().ToJson());
  4498. Assert.AreEqual(2, Consume(query));
  4499. }
  4500. [Test]
  4501. public void TestWhereSLengthLessThan3()
  4502. {
  4503. var query = from c in _collection.AsQueryable<C>()
  4504. where c.S.Length < 3
  4505. select c;
  4506. var translatedQuery = MongoQueryTranslator.Translate(query);
  4507. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4508. Assert.AreSame(_collection, translatedQuery.Collection);
  4509. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4510. var selectQuery = (SelectQuery)translatedQuery;
  4511. Assert.AreEqual("(C c) => (c.S.Length < 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4512. Assert.IsNull(selectQuery.OrderBy);
  4513. Assert.IsNull(selectQuery.Projection);
  4514. Assert.IsNull(selectQuery.Skip);
  4515. Assert.IsNull(selectQuery.Take);
  4516. Assert.AreEqual("{ \"s\" : /^.{0,2}$/s }", selectQuery.BuildQuery().ToJson());
  4517. Assert.AreEqual(0, Consume(query));
  4518. }
  4519. [Test]
  4520. public void TestWhereSLengthLessThanOrEquals3()
  4521. {
  4522. var query = from c in _collection.AsQueryable<C>()
  4523. where c.S.Length <= 3
  4524. select c;
  4525. var translatedQuery = MongoQueryTranslator.Translate(query);
  4526. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4527. Assert.AreSame(_collection, translatedQuery.Collection);
  4528. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4529. var selectQuery = (SelectQuery)translatedQuery;
  4530. Assert.AreEqual("(C c) => (c.S.Length <= 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4531. Assert.IsNull(selectQuery.OrderBy);
  4532. Assert.IsNull(selectQuery.Projection);
  4533. Assert.IsNull(selectQuery.Skip);
  4534. Assert.IsNull(selectQuery.Take);
  4535. Assert.AreEqual("{ \"s\" : /^.{0,3}$/s }", selectQuery.BuildQuery().ToJson());
  4536. Assert.AreEqual(1, Consume(query));
  4537. }
  4538. [Test]
  4539. public void TestWhereSLengthNotEquals3()
  4540. {
  4541. var query = from c in _collection.AsQueryable<C>()
  4542. where c.S.Length != 3
  4543. select c;
  4544. var translatedQuery = MongoQueryTranslator.Translate(query);
  4545. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4546. Assert.AreSame(_collection, translatedQuery.Collection);
  4547. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4548. var selectQuery = (SelectQuery)translatedQuery;
  4549. Assert.AreEqual("(C c) => (c.S.Length != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4550. Assert.IsNull(selectQuery.OrderBy);
  4551. Assert.IsNull(selectQuery.Projection);
  4552. Assert.IsNull(selectQuery.Skip);
  4553. Assert.IsNull(selectQuery.Take);
  4554. Assert.AreEqual("{ \"s\" : { \"$not\" : /^.{3}$/s } }", selectQuery.BuildQuery().ToJson());
  4555. Assert.AreEqual(4, Consume(query));
  4556. }
  4557. [Test]
  4558. public void TestWhereSLengthNotEquals3Not()
  4559. {
  4560. var query = from c in _collection.AsQueryable<C>()
  4561. where !(c.S.Length != 3)
  4562. select c;
  4563. var translatedQuery = MongoQueryTranslator.Translate(query);
  4564. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4565. Assert.AreSame(_collection, translatedQuery.Collection);
  4566. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4567. var selectQuery = (SelectQuery)translatedQuery;
  4568. Assert.AreEqual("(C c) => !(c.S.Length != 3)", ExpressionFormatter.ToString(selectQuery.Where));
  4569. Assert.IsNull(selectQuery.OrderBy);
  4570. Assert.IsNull(selectQuery.Projection);
  4571. Assert.IsNull(selectQuery.Skip);
  4572. Assert.IsNull(selectQuery.Take);
  4573. Assert.AreEqual("{ \"s\" : /^.{3}$/s }", selectQuery.BuildQuery().ToJson());
  4574. Assert.AreEqual(1, Consume(query));
  4575. }
  4576. [Test]
  4577. public void TestWhereSNotEqualsAbc()
  4578. {
  4579. var query = from c in _collection.AsQueryable<C>()
  4580. where c.S != "abc"
  4581. select c;
  4582. var translatedQuery = MongoQueryTranslator.Translate(query);
  4583. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4584. Assert.AreSame(_collection, translatedQuery.Collection);
  4585. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4586. var selectQuery = (SelectQuery)translatedQuery;
  4587. Assert.AreEqual("(C c) => (c.S != \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4588. Assert.IsNull(selectQuery.OrderBy);
  4589. Assert.IsNull(selectQuery.Projection);
  4590. Assert.IsNull(selectQuery.Skip);
  4591. Assert.IsNull(selectQuery.Take);
  4592. Assert.AreEqual("{ \"s\" : { \"$ne\" : \"abc\" } }", selectQuery.BuildQuery().ToJson());
  4593. Assert.AreEqual(4, Consume(query));
  4594. }
  4595. [Test]
  4596. public void TestWhereSNotEqualsAbcNot()
  4597. {
  4598. var query = from c in _collection.AsQueryable<C>()
  4599. where !(c.S != "abc")
  4600. select c;
  4601. var translatedQuery = MongoQueryTranslator.Translate(query);
  4602. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4603. Assert.AreSame(_collection, translatedQuery.Collection);
  4604. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4605. var selectQuery = (SelectQuery)translatedQuery;
  4606. Assert.AreEqual("(C c) => !(c.S != \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4607. Assert.IsNull(selectQuery.OrderBy);
  4608. Assert.IsNull(selectQuery.Projection);
  4609. Assert.IsNull(selectQuery.Skip);
  4610. Assert.IsNull(selectQuery.Take);
  4611. Assert.AreEqual("{ \"s\" : \"abc\" }", selectQuery.BuildQuery().ToJson());
  4612. Assert.AreEqual(1, Consume(query));
  4613. }
  4614. [Test]
  4615. public void TestWhereSStartsWithAbc()
  4616. {
  4617. var query = from c in _collection.AsQueryable<C>()
  4618. where c.S.StartsWith("abc")
  4619. select c;
  4620. var translatedQuery = MongoQueryTranslator.Translate(query);
  4621. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4622. Assert.AreSame(_collection, translatedQuery.Collection);
  4623. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4624. var selectQuery = (SelectQuery)translatedQuery;
  4625. Assert.AreEqual("(C c) => c.S.StartsWith(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4626. Assert.IsNull(selectQuery.OrderBy);
  4627. Assert.IsNull(selectQuery.Projection);
  4628. Assert.IsNull(selectQuery.Skip);
  4629. Assert.IsNull(selectQuery.Take);
  4630. Assert.AreEqual("{ \"s\" : /^abc/s }", selectQuery.BuildQuery().ToJson());
  4631. Assert.AreEqual(1, Consume(query));
  4632. }
  4633. [Test]
  4634. public void TestWhereSStartsWithAbcNot()
  4635. {
  4636. var query = from c in _collection.AsQueryable<C>()
  4637. where !c.S.StartsWith("abc")
  4638. select c;
  4639. var translatedQuery = MongoQueryTranslator.Translate(query);
  4640. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4641. Assert.AreSame(_collection, translatedQuery.Collection);
  4642. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4643. var selectQuery = (SelectQuery)translatedQuery;
  4644. Assert.AreEqual("(C c) => !c.S.StartsWith(\"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4645. Assert.IsNull(selectQuery.OrderBy);
  4646. Assert.IsNull(selectQuery.Projection);
  4647. Assert.IsNull(selectQuery.Skip);
  4648. Assert.IsNull(selectQuery.Take);
  4649. Assert.AreEqual("{ \"s\" : { \"$not\" : /^abc/s } }", selectQuery.BuildQuery().ToJson());
  4650. Assert.AreEqual(4, Consume(query));
  4651. }
  4652. [Test]
  4653. public void TestWhereSSub1EqualsB()
  4654. {
  4655. var query = from c in _collection.AsQueryable<C>()
  4656. where c.S[1] == 'b'
  4657. select c;
  4658. var translatedQuery = MongoQueryTranslator.Translate(query);
  4659. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4660. Assert.AreSame(_collection, translatedQuery.Collection);
  4661. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4662. var selectQuery = (SelectQuery)translatedQuery;
  4663. Assert.AreEqual("(C c) => ((Int32)c.S.get_Chars(1) == 98)", ExpressionFormatter.ToString(selectQuery.Where));
  4664. Assert.IsNull(selectQuery.OrderBy);
  4665. Assert.IsNull(selectQuery.Projection);
  4666. Assert.IsNull(selectQuery.Skip);
  4667. Assert.IsNull(selectQuery.Take);
  4668. Assert.AreEqual("{ \"s\" : /^.{1}b/s }", selectQuery.BuildQuery().ToJson());
  4669. Assert.AreEqual(1, Consume(query));
  4670. }
  4671. [Test]
  4672. public void TestWhereSSub1EqualsBNot()
  4673. {
  4674. var query = from c in _collection.AsQueryable<C>()
  4675. where !(c.S[1] == 'b')
  4676. select c;
  4677. var translatedQuery = MongoQueryTranslator.Translate(query);
  4678. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4679. Assert.AreSame(_collection, translatedQuery.Collection);
  4680. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4681. var selectQuery = (SelectQuery)translatedQuery;
  4682. Assert.AreEqual("(C c) => !((Int32)c.S.get_Chars(1) == 98)", ExpressionFormatter.ToString(selectQuery.Where));
  4683. Assert.IsNull(selectQuery.OrderBy);
  4684. Assert.IsNull(selectQuery.Projection);
  4685. Assert.IsNull(selectQuery.Skip);
  4686. Assert.IsNull(selectQuery.Take);
  4687. Assert.AreEqual("{ \"s\" : { \"$not\" : /^.{1}b/s } }", selectQuery.BuildQuery().ToJson());
  4688. Assert.AreEqual(4, Consume(query));
  4689. }
  4690. [Test]
  4691. public void TestWhereSSub1NotEqualsB()
  4692. {
  4693. var query = from c in _collection.AsQueryable<C>()
  4694. where c.S[1] != 'b'
  4695. select c;
  4696. var translatedQuery = MongoQueryTranslator.Translate(query);
  4697. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4698. Assert.AreSame(_collection, translatedQuery.Collection);
  4699. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4700. var selectQuery = (SelectQuery)translatedQuery;
  4701. Assert.AreEqual("(C c) => ((Int32)c.S.get_Chars(1) != 98)", ExpressionFormatter.ToString(selectQuery.Where));
  4702. Assert.IsNull(selectQuery.OrderBy);
  4703. Assert.IsNull(selectQuery.Projection);
  4704. Assert.IsNull(selectQuery.Skip);
  4705. Assert.IsNull(selectQuery.Take);
  4706. Assert.AreEqual("{ \"s\" : /^.{1}[^b]/s }", selectQuery.BuildQuery().ToJson());
  4707. Assert.AreEqual(1, Consume(query));
  4708. }
  4709. [Test]
  4710. public void TestWhereSSub1NotEqualsBNot()
  4711. {
  4712. var query = from c in _collection.AsQueryable<C>()
  4713. where !(c.S[1] != 'b')
  4714. select c;
  4715. var translatedQuery = MongoQueryTranslator.Translate(query);
  4716. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4717. Assert.AreSame(_collection, translatedQuery.Collection);
  4718. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4719. var selectQuery = (SelectQuery)translatedQuery;
  4720. Assert.AreEqual("(C c) => !((Int32)c.S.get_Chars(1) != 98)", ExpressionFormatter.ToString(selectQuery.Where));
  4721. Assert.IsNull(selectQuery.OrderBy);
  4722. Assert.IsNull(selectQuery.Projection);
  4723. Assert.IsNull(selectQuery.Skip);
  4724. Assert.IsNull(selectQuery.Take);
  4725. Assert.AreEqual("{ \"s\" : { \"$not\" : /^.{1}[^b]/s } }", selectQuery.BuildQuery().ToJson());
  4726. Assert.AreEqual(4, Consume(query));
  4727. }
  4728. [Test]
  4729. public void TestWhereSTrimContainsXyz()
  4730. {
  4731. var query = from c in _collection.AsQueryable<C>()
  4732. where c.S.Trim().Contains("xyz")
  4733. select c;
  4734. var translatedQuery = MongoQueryTranslator.Translate(query);
  4735. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4736. Assert.AreSame(_collection, translatedQuery.Collection);
  4737. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4738. var selectQuery = (SelectQuery)translatedQuery;
  4739. Assert.AreEqual("(C c) => c.S.Trim().Contains(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  4740. Assert.IsNull(selectQuery.OrderBy);
  4741. Assert.IsNull(selectQuery.Projection);
  4742. Assert.IsNull(selectQuery.Skip);
  4743. Assert.IsNull(selectQuery.Take);
  4744. Assert.AreEqual("{ \"s\" : /^\\s*.*xyz.*\\s*$/s }", selectQuery.BuildQuery().ToJson());
  4745. Assert.AreEqual(1, Consume(query));
  4746. }
  4747. [Test]
  4748. public void TestWhereSTrimContainsXyzNot()
  4749. {
  4750. var query = from c in _collection.AsQueryable<C>()
  4751. where !c.S.Trim().Contains("xyz")
  4752. select c;
  4753. var translatedQuery = MongoQueryTranslator.Translate(query);
  4754. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4755. Assert.AreSame(_collection, translatedQuery.Collection);
  4756. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4757. var selectQuery = (SelectQuery)translatedQuery;
  4758. Assert.AreEqual("(C c) => !c.S.Trim().Contains(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  4759. Assert.IsNull(selectQuery.OrderBy);
  4760. Assert.IsNull(selectQuery.Projection);
  4761. Assert.IsNull(selectQuery.Skip);
  4762. Assert.IsNull(selectQuery.Take);
  4763. Assert.AreEqual("{ \"s\" : { \"$not\" : /^\\s*.*xyz.*\\s*$/s } }", selectQuery.BuildQuery().ToJson());
  4764. Assert.AreEqual(4, Consume(query));
  4765. }
  4766. [Test]
  4767. public void TestWhereSTrimEndsWithXyz()
  4768. {
  4769. var query = from c in _collection.AsQueryable<C>()
  4770. where c.S.Trim().EndsWith("xyz")
  4771. select c;
  4772. var translatedQuery = MongoQueryTranslator.Translate(query);
  4773. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4774. Assert.AreSame(_collection, translatedQuery.Collection);
  4775. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4776. var selectQuery = (SelectQuery)translatedQuery;
  4777. Assert.AreEqual("(C c) => c.S.Trim().EndsWith(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  4778. Assert.IsNull(selectQuery.OrderBy);
  4779. Assert.IsNull(selectQuery.Projection);
  4780. Assert.IsNull(selectQuery.Skip);
  4781. Assert.IsNull(selectQuery.Take);
  4782. Assert.AreEqual("{ \"s\" : /^\\s*.*xyz\\s*$/s }", selectQuery.BuildQuery().ToJson());
  4783. Assert.AreEqual(1, Consume(query));
  4784. }
  4785. [Test]
  4786. public void TestWhereSTrimEndsWithXyzNot()
  4787. {
  4788. var query = from c in _collection.AsQueryable<C>()
  4789. where !c.S.Trim().EndsWith("xyz")
  4790. select c;
  4791. var translatedQuery = MongoQueryTranslator.Translate(query);
  4792. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4793. Assert.AreSame(_collection, translatedQuery.Collection);
  4794. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4795. var selectQuery = (SelectQuery)translatedQuery;
  4796. Assert.AreEqual("(C c) => !c.S.Trim().EndsWith(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  4797. Assert.IsNull(selectQuery.OrderBy);
  4798. Assert.IsNull(selectQuery.Projection);
  4799. Assert.IsNull(selectQuery.Skip);
  4800. Assert.IsNull(selectQuery.Take);
  4801. Assert.AreEqual("{ \"s\" : { \"$not\" : /^\\s*.*xyz\\s*$/s } }", selectQuery.BuildQuery().ToJson());
  4802. Assert.AreEqual(4, Consume(query));
  4803. }
  4804. [Test]
  4805. public void TestWhereSTrimStartsWithXyz()
  4806. {
  4807. var query = from c in _collection.AsQueryable<C>()
  4808. where c.S.Trim().StartsWith("xyz")
  4809. select c;
  4810. var translatedQuery = MongoQueryTranslator.Translate(query);
  4811. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4812. Assert.AreSame(_collection, translatedQuery.Collection);
  4813. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4814. var selectQuery = (SelectQuery)translatedQuery;
  4815. Assert.AreEqual("(C c) => c.S.Trim().StartsWith(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  4816. Assert.IsNull(selectQuery.OrderBy);
  4817. Assert.IsNull(selectQuery.Projection);
  4818. Assert.IsNull(selectQuery.Skip);
  4819. Assert.IsNull(selectQuery.Take);
  4820. Assert.AreEqual("{ \"s\" : /^\\s*xyz.*\\s*$/s }", selectQuery.BuildQuery().ToJson());
  4821. Assert.AreEqual(1, Consume(query));
  4822. }
  4823. [Test]
  4824. public void TestWhereSTrimStartsWithXyzNot()
  4825. {
  4826. var query = from c in _collection.AsQueryable<C>()
  4827. where !c.S.Trim().StartsWith("xyz")
  4828. select c;
  4829. var translatedQuery = MongoQueryTranslator.Translate(query);
  4830. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4831. Assert.AreSame(_collection, translatedQuery.Collection);
  4832. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4833. var selectQuery = (SelectQuery)translatedQuery;
  4834. Assert.AreEqual("(C c) => !c.S.Trim().StartsWith(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  4835. Assert.IsNull(selectQuery.OrderBy);
  4836. Assert.IsNull(selectQuery.Projection);
  4837. Assert.IsNull(selectQuery.Skip);
  4838. Assert.IsNull(selectQuery.Take);
  4839. Assert.AreEqual("{ \"s\" : { \"$not\" : /^\\s*xyz.*\\s*$/s } }", selectQuery.BuildQuery().ToJson());
  4840. Assert.AreEqual(4, Consume(query));
  4841. }
  4842. [Test]
  4843. public void TestWhereSTrimStartTrimEndToLowerContainsXyz()
  4844. {
  4845. var query = from c in _collection.AsQueryable<C>()
  4846. where c.S.TrimStart(' ', '.', '-', '\t').TrimEnd().ToLower().Contains("xyz")
  4847. select c;
  4848. var translatedQuery = MongoQueryTranslator.Translate(query);
  4849. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4850. Assert.AreSame(_collection, translatedQuery.Collection);
  4851. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4852. var selectQuery = (SelectQuery)translatedQuery;
  4853. Assert.AreEqual("(C c) => c.S.TrimStart(Char[]:{ ' ', '.', '-', '\t' }).TrimEnd(Char[]:{ }).ToLower().Contains(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  4854. Assert.IsNull(selectQuery.OrderBy);
  4855. Assert.IsNull(selectQuery.Projection);
  4856. Assert.IsNull(selectQuery.Skip);
  4857. Assert.IsNull(selectQuery.Take);
  4858. Assert.AreEqual("{ \"s\" : /^[\\ \\.\\-\\t]*.*xyz.*\\s*$/is }", selectQuery.BuildQuery().ToJson());
  4859. Assert.AreEqual(1, Consume(query));
  4860. }
  4861. [Test]
  4862. public void TestWhereSToLowerEqualsConstantLowerCaseValue()
  4863. {
  4864. var query = from c in _collection.AsQueryable<C>()
  4865. where c.S.ToLower() == "abc"
  4866. select c;
  4867. var translatedQuery = MongoQueryTranslator.Translate(query);
  4868. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4869. Assert.AreSame(_collection, translatedQuery.Collection);
  4870. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4871. var selectQuery = (SelectQuery)translatedQuery;
  4872. Assert.AreEqual("(C c) => (c.S.ToLower() == \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4873. Assert.IsNull(selectQuery.OrderBy);
  4874. Assert.IsNull(selectQuery.Projection);
  4875. Assert.IsNull(selectQuery.Skip);
  4876. Assert.IsNull(selectQuery.Take);
  4877. Assert.AreEqual("{ \"s\" : /^abc$/i }", selectQuery.BuildQuery().ToJson());
  4878. Assert.AreEqual(1, Consume(query));
  4879. }
  4880. [Test]
  4881. public void TestWhereSToLowerDoesNotEqualConstantLowerCaseValue()
  4882. {
  4883. var query = from c in _collection.AsQueryable<C>()
  4884. where c.S.ToLower() != "abc"
  4885. select c;
  4886. var translatedQuery = MongoQueryTranslator.Translate(query);
  4887. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4888. Assert.AreSame(_collection, translatedQuery.Collection);
  4889. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4890. var selectQuery = (SelectQuery)translatedQuery;
  4891. Assert.AreEqual("(C c) => (c.S.ToLower() != \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4892. Assert.IsNull(selectQuery.OrderBy);
  4893. Assert.IsNull(selectQuery.Projection);
  4894. Assert.IsNull(selectQuery.Skip);
  4895. Assert.IsNull(selectQuery.Take);
  4896. Assert.AreEqual("{ \"s\" : { \"$not\" : /^abc$/i } }", selectQuery.BuildQuery().ToJson());
  4897. Assert.AreEqual(4, Consume(query));
  4898. }
  4899. [Test]
  4900. public void TestWhereSToLowerEqualsConstantMixedCaseValue()
  4901. {
  4902. var query = from c in _collection.AsQueryable<C>()
  4903. where c.S.ToLower() == "Abc"
  4904. select c;
  4905. var translatedQuery = MongoQueryTranslator.Translate(query);
  4906. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4907. Assert.AreSame(_collection, translatedQuery.Collection);
  4908. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4909. var selectQuery = (SelectQuery)translatedQuery;
  4910. Assert.AreEqual("(C c) => (c.S.ToLower() == \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4911. Assert.IsNull(selectQuery.OrderBy);
  4912. Assert.IsNull(selectQuery.Projection);
  4913. Assert.IsNull(selectQuery.Skip);
  4914. Assert.IsNull(selectQuery.Take);
  4915. Assert.AreEqual("{ \"_id\" : { \"$type\" : -1 } }", selectQuery.BuildQuery().ToJson());
  4916. Assert.AreEqual(0, Consume(query));
  4917. }
  4918. [Test]
  4919. public void TestWhereSToLowerDoesNotEqualConstantMixedCaseValue()
  4920. {
  4921. var query = from c in _collection.AsQueryable<C>()
  4922. where c.S.ToLower() != "Abc"
  4923. select c;
  4924. var translatedQuery = MongoQueryTranslator.Translate(query);
  4925. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4926. Assert.AreSame(_collection, translatedQuery.Collection);
  4927. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4928. var selectQuery = (SelectQuery)translatedQuery;
  4929. Assert.AreEqual("(C c) => (c.S.ToLower() != \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4930. Assert.IsNull(selectQuery.OrderBy);
  4931. Assert.IsNull(selectQuery.Projection);
  4932. Assert.IsNull(selectQuery.Skip);
  4933. Assert.IsNull(selectQuery.Take);
  4934. Assert.AreEqual("{ }", selectQuery.BuildQuery().ToJson());
  4935. Assert.AreEqual(5, Consume(query));
  4936. }
  4937. [Test]
  4938. public void TestWhereSToLowerEqualsNullValue()
  4939. {
  4940. var query = from c in _collection.AsQueryable<C>()
  4941. where c.S.ToLower() == null
  4942. select c;
  4943. var translatedQuery = MongoQueryTranslator.Translate(query);
  4944. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4945. Assert.AreSame(_collection, translatedQuery.Collection);
  4946. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4947. var selectQuery = (SelectQuery)translatedQuery;
  4948. Assert.AreEqual("(C c) => (c.S.ToLower() == null)", ExpressionFormatter.ToString(selectQuery.Where));
  4949. Assert.IsNull(selectQuery.OrderBy);
  4950. Assert.IsNull(selectQuery.Projection);
  4951. Assert.IsNull(selectQuery.Skip);
  4952. Assert.IsNull(selectQuery.Take);
  4953. Assert.AreEqual("{ \"s\" : null }", selectQuery.BuildQuery().ToJson());
  4954. Assert.AreEqual(3, Consume(query));
  4955. }
  4956. [Test]
  4957. public void TestWhereSToLowerDoesNotEqualNullValue()
  4958. {
  4959. var query = from c in _collection.AsQueryable<C>()
  4960. where c.S.ToLower() != null
  4961. select c;
  4962. var translatedQuery = MongoQueryTranslator.Translate(query);
  4963. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4964. Assert.AreSame(_collection, translatedQuery.Collection);
  4965. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4966. var selectQuery = (SelectQuery)translatedQuery;
  4967. Assert.AreEqual("(C c) => (c.S.ToLower() != null)", ExpressionFormatter.ToString(selectQuery.Where));
  4968. Assert.IsNull(selectQuery.OrderBy);
  4969. Assert.IsNull(selectQuery.Projection);
  4970. Assert.IsNull(selectQuery.Skip);
  4971. Assert.IsNull(selectQuery.Take);
  4972. Assert.AreEqual("{ \"s\" : { \"$ne\" : null } }", selectQuery.BuildQuery().ToJson());
  4973. Assert.AreEqual(2, Consume(query));
  4974. }
  4975. [Test]
  4976. public void TestWhereSToUpperEqualsConstantLowerCaseValue()
  4977. {
  4978. var query = from c in _collection.AsQueryable<C>()
  4979. where c.S.ToUpper() == "abc"
  4980. select c;
  4981. var translatedQuery = MongoQueryTranslator.Translate(query);
  4982. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  4983. Assert.AreSame(_collection, translatedQuery.Collection);
  4984. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  4985. var selectQuery = (SelectQuery)translatedQuery;
  4986. Assert.AreEqual("(C c) => (c.S.ToUpper() == \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  4987. Assert.IsNull(selectQuery.OrderBy);
  4988. Assert.IsNull(selectQuery.Projection);
  4989. Assert.IsNull(selectQuery.Skip);
  4990. Assert.IsNull(selectQuery.Take);
  4991. Assert.AreEqual("{ \"_id\" : { \"$type\" : -1 } }", selectQuery.BuildQuery().ToJson());
  4992. Assert.AreEqual(0, Consume(query));
  4993. }
  4994. [Test]
  4995. public void TestWhereSToUpperDoesNotEqualConstantLowerCaseValue()
  4996. {
  4997. var query = from c in _collection.AsQueryable<C>()
  4998. where c.S.ToUpper() != "abc"
  4999. select c;
  5000. var translatedQuery = MongoQueryTranslator.Translate(query);
  5001. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5002. Assert.AreSame(_collection, translatedQuery.Collection);
  5003. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5004. var selectQuery = (SelectQuery)translatedQuery;
  5005. Assert.AreEqual("(C c) => (c.S.ToUpper() != \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5006. Assert.IsNull(selectQuery.OrderBy);
  5007. Assert.IsNull(selectQuery.Projection);
  5008. Assert.IsNull(selectQuery.Skip);
  5009. Assert.IsNull(selectQuery.Take);
  5010. Assert.AreEqual("{ }", selectQuery.BuildQuery().ToJson());
  5011. Assert.AreEqual(5, Consume(query));
  5012. }
  5013. [Test]
  5014. public void TestWhereSToUpperEqualsConstantMixedCaseValue()
  5015. {
  5016. var query = from c in _collection.AsQueryable<C>()
  5017. where c.S.ToUpper() == "Abc"
  5018. select c;
  5019. var translatedQuery = MongoQueryTranslator.Translate(query);
  5020. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5021. Assert.AreSame(_collection, translatedQuery.Collection);
  5022. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5023. var selectQuery = (SelectQuery)translatedQuery;
  5024. Assert.AreEqual("(C c) => (c.S.ToUpper() == \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5025. Assert.IsNull(selectQuery.OrderBy);
  5026. Assert.IsNull(selectQuery.Projection);
  5027. Assert.IsNull(selectQuery.Skip);
  5028. Assert.IsNull(selectQuery.Take);
  5029. Assert.AreEqual("{ \"_id\" : { \"$type\" : -1 } }", selectQuery.BuildQuery().ToJson());
  5030. Assert.AreEqual(0, Consume(query));
  5031. }
  5032. [Test]
  5033. public void TestWhereSToUpperDoesNotEqualConstantMixedCaseValue()
  5034. {
  5035. var query = from c in _collection.AsQueryable<C>()
  5036. where c.S.ToUpper() != "Abc"
  5037. select c;
  5038. var translatedQuery = MongoQueryTranslator.Translate(query);
  5039. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5040. Assert.AreSame(_collection, translatedQuery.Collection);
  5041. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5042. var selectQuery = (SelectQuery)translatedQuery;
  5043. Assert.AreEqual("(C c) => (c.S.ToUpper() != \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5044. Assert.IsNull(selectQuery.OrderBy);
  5045. Assert.IsNull(selectQuery.Projection);
  5046. Assert.IsNull(selectQuery.Skip);
  5047. Assert.IsNull(selectQuery.Take);
  5048. Assert.AreEqual("{ }", selectQuery.BuildQuery().ToJson());
  5049. Assert.AreEqual(5, Consume(query));
  5050. }
  5051. [Test]
  5052. public void TestWhereSToUpperEqualsNullValue()
  5053. {
  5054. var query = from c in _collection.AsQueryable<C>()
  5055. where c.S.ToUpper() == null
  5056. select c;
  5057. var translatedQuery = MongoQueryTranslator.Translate(query);
  5058. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5059. Assert.AreSame(_collection, translatedQuery.Collection);
  5060. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5061. var selectQuery = (SelectQuery)translatedQuery;
  5062. Assert.AreEqual("(C c) => (c.S.ToUpper() == null)", ExpressionFormatter.ToString(selectQuery.Where));
  5063. Assert.IsNull(selectQuery.OrderBy);
  5064. Assert.IsNull(selectQuery.Projection);
  5065. Assert.IsNull(selectQuery.Skip);
  5066. Assert.IsNull(selectQuery.Take);
  5067. Assert.AreEqual("{ \"s\" : null }", selectQuery.BuildQuery().ToJson());
  5068. Assert.AreEqual(3, Consume(query));
  5069. }
  5070. [Test]
  5071. public void TestWhereSToUpperDoesNotEqualNullValue()
  5072. {
  5073. var query = from c in _collection.AsQueryable<C>()
  5074. where c.S.ToUpper() != null
  5075. select c;
  5076. var translatedQuery = MongoQueryTranslator.Translate(query);
  5077. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5078. Assert.AreSame(_collection, translatedQuery.Collection);
  5079. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5080. var selectQuery = (SelectQuery)translatedQuery;
  5081. Assert.AreEqual("(C c) => (c.S.ToUpper() != null)", ExpressionFormatter.ToString(selectQuery.Where));
  5082. Assert.IsNull(selectQuery.OrderBy);
  5083. Assert.IsNull(selectQuery.Projection);
  5084. Assert.IsNull(selectQuery.Skip);
  5085. Assert.IsNull(selectQuery.Take);
  5086. Assert.AreEqual("{ \"s\" : { \"$ne\" : null } }", selectQuery.BuildQuery().ToJson());
  5087. Assert.AreEqual(2, Consume(query));
  5088. }
  5089. [Test]
  5090. public void TestWhereSTrimStartTrimEndToLowerInvariantContainsXyz()
  5091. {
  5092. var query = from c in _collection.AsQueryable<C>()
  5093. where c.S.TrimStart(' ', '.', '-', '\t').TrimEnd().ToLowerInvariant().Contains("xyz")
  5094. select c;
  5095. var translatedQuery = MongoQueryTranslator.Translate(query);
  5096. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5097. Assert.AreSame(_collection, translatedQuery.Collection);
  5098. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5099. var selectQuery = (SelectQuery)translatedQuery;
  5100. Assert.AreEqual("(C c) => c.S.TrimStart(Char[]:{ ' ', '.', '-', '\t' }).TrimEnd(Char[]:{ }).ToLowerInvariant().Contains(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
  5101. Assert.IsNull(selectQuery.OrderBy);
  5102. Assert.IsNull(selectQuery.Projection);
  5103. Assert.IsNull(selectQuery.Skip);
  5104. Assert.IsNull(selectQuery.Take);
  5105. Assert.AreEqual("{ \"s\" : /^[\\ \\.\\-\\t]*.*xyz.*\\s*$/is }", selectQuery.BuildQuery().ToJson());
  5106. Assert.AreEqual(1, Consume(query));
  5107. }
  5108. [Test]
  5109. public void TestWhereSToLowerInvariantEqualsConstantLowerCaseValue()
  5110. {
  5111. var query = from c in _collection.AsQueryable<C>()
  5112. where c.S.ToLowerInvariant() == "abc"
  5113. select c;
  5114. var translatedQuery = MongoQueryTranslator.Translate(query);
  5115. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5116. Assert.AreSame(_collection, translatedQuery.Collection);
  5117. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5118. var selectQuery = (SelectQuery)translatedQuery;
  5119. Assert.AreEqual("(C c) => (c.S.ToLowerInvariant() == \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5120. Assert.IsNull(selectQuery.OrderBy);
  5121. Assert.IsNull(selectQuery.Projection);
  5122. Assert.IsNull(selectQuery.Skip);
  5123. Assert.IsNull(selectQuery.Take);
  5124. Assert.AreEqual("{ \"s\" : /^abc$/i }", selectQuery.BuildQuery().ToJson());
  5125. Assert.AreEqual(1, Consume(query));
  5126. }
  5127. [Test]
  5128. public void TestWhereSToLowerInvariantDoesNotEqualConstantLowerCaseValue()
  5129. {
  5130. var query = from c in _collection.AsQueryable<C>()
  5131. where c.S.ToLowerInvariant() != "abc"
  5132. select c;
  5133. var translatedQuery = MongoQueryTranslator.Translate(query);
  5134. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5135. Assert.AreSame(_collection, translatedQuery.Collection);
  5136. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5137. var selectQuery = (SelectQuery)translatedQuery;
  5138. Assert.AreEqual("(C c) => (c.S.ToLowerInvariant() != \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5139. Assert.IsNull(selectQuery.OrderBy);
  5140. Assert.IsNull(selectQuery.Projection);
  5141. Assert.IsNull(selectQuery.Skip);
  5142. Assert.IsNull(selectQuery.Take);
  5143. Assert.AreEqual("{ \"s\" : { \"$not\" : /^abc$/i } }", selectQuery.BuildQuery().ToJson());
  5144. Assert.AreEqual(4, Consume(query));
  5145. }
  5146. [Test]
  5147. public void TestWhereSToLowerInvariantEqualsConstantMixedCaseValue()
  5148. {
  5149. var query = from c in _collection.AsQueryable<C>()
  5150. where c.S.ToLowerInvariant() == "Abc"
  5151. select c;
  5152. var translatedQuery = MongoQueryTranslator.Translate(query);
  5153. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5154. Assert.AreSame(_collection, translatedQuery.Collection);
  5155. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5156. var selectQuery = (SelectQuery)translatedQuery;
  5157. Assert.AreEqual("(C c) => (c.S.ToLowerInvariant() == \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5158. Assert.IsNull(selectQuery.OrderBy);
  5159. Assert.IsNull(selectQuery.Projection);
  5160. Assert.IsNull(selectQuery.Skip);
  5161. Assert.IsNull(selectQuery.Take);
  5162. Assert.AreEqual("{ \"_id\" : { \"$type\" : -1 } }", selectQuery.BuildQuery().ToJson());
  5163. Assert.AreEqual(0, Consume(query));
  5164. }
  5165. [Test]
  5166. public void TestWhereSToLowerInvariantDoesNotEqualConstantMixedCaseValue()
  5167. {
  5168. var query = from c in _collection.AsQueryable<C>()
  5169. where c.S.ToLowerInvariant() != "Abc"
  5170. select c;
  5171. var translatedQuery = MongoQueryTranslator.Translate(query);
  5172. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5173. Assert.AreSame(_collection, translatedQuery.Collection);
  5174. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5175. var selectQuery = (SelectQuery)translatedQuery;
  5176. Assert.AreEqual("(C c) => (c.S.ToLowerInvariant() != \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5177. Assert.IsNull(selectQuery.OrderBy);
  5178. Assert.IsNull(selectQuery.Projection);
  5179. Assert.IsNull(selectQuery.Skip);
  5180. Assert.IsNull(selectQuery.Take);
  5181. Assert.AreEqual("{ }", selectQuery.BuildQuery().ToJson());
  5182. Assert.AreEqual(5, Consume(query));
  5183. }
  5184. [Test]
  5185. public void TestWhereSToLowerInvariantEqualsNullValue()
  5186. {
  5187. var query = from c in _collection.AsQueryable<C>()
  5188. where c.S.ToLowerInvariant() == null
  5189. select c;
  5190. var translatedQuery = MongoQueryTranslator.Translate(query);
  5191. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5192. Assert.AreSame(_collection, translatedQuery.Collection);
  5193. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5194. var selectQuery = (SelectQuery)translatedQuery;
  5195. Assert.AreEqual("(C c) => (c.S.ToLowerInvariant() == null)", ExpressionFormatter.ToString(selectQuery.Where));
  5196. Assert.IsNull(selectQuery.OrderBy);
  5197. Assert.IsNull(selectQuery.Projection);
  5198. Assert.IsNull(selectQuery.Skip);
  5199. Assert.IsNull(selectQuery.Take);
  5200. Assert.AreEqual("{ \"s\" : null }", selectQuery.BuildQuery().ToJson());
  5201. Assert.AreEqual(3, Consume(query));
  5202. }
  5203. [Test]
  5204. public void TestWhereSToLowerInvariantDoesNotEqualNullValue()
  5205. {
  5206. var query = from c in _collection.AsQueryable<C>()
  5207. where c.S.ToLowerInvariant() != null
  5208. select c;
  5209. var translatedQuery = MongoQueryTranslator.Translate(query);
  5210. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5211. Assert.AreSame(_collection, translatedQuery.Collection);
  5212. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5213. var selectQuery = (SelectQuery)translatedQuery;
  5214. Assert.AreEqual("(C c) => (c.S.ToLowerInvariant() != null)", ExpressionFormatter.ToString(selectQuery.Where));
  5215. Assert.IsNull(selectQuery.OrderBy);
  5216. Assert.IsNull(selectQuery.Projection);
  5217. Assert.IsNull(selectQuery.Skip);
  5218. Assert.IsNull(selectQuery.Take);
  5219. Assert.AreEqual("{ \"s\" : { \"$ne\" : null } }", selectQuery.BuildQuery().ToJson());
  5220. Assert.AreEqual(2, Consume(query));
  5221. }
  5222. [Test]
  5223. public void TestWhereSToUpperInvariantEqualsConstantLowerCaseValue()
  5224. {
  5225. var query = from c in _collection.AsQueryable<C>()
  5226. where c.S.ToUpperInvariant() == "abc"
  5227. select c;
  5228. var translatedQuery = MongoQueryTranslator.Translate(query);
  5229. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5230. Assert.AreSame(_collection, translatedQuery.Collection);
  5231. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5232. var selectQuery = (SelectQuery)translatedQuery;
  5233. Assert.AreEqual("(C c) => (c.S.ToUpperInvariant() == \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5234. Assert.IsNull(selectQuery.OrderBy);
  5235. Assert.IsNull(selectQuery.Projection);
  5236. Assert.IsNull(selectQuery.Skip);
  5237. Assert.IsNull(selectQuery.Take);
  5238. Assert.AreEqual("{ \"_id\" : { \"$type\" : -1 } }", selectQuery.BuildQuery().ToJson());
  5239. Assert.AreEqual(0, Consume(query));
  5240. }
  5241. [Test]
  5242. public void TestWhereSToUpperInvariantDoesNotEqualConstantLowerCaseValue()
  5243. {
  5244. var query = from c in _collection.AsQueryable<C>()
  5245. where c.S.ToUpperInvariant() != "abc"
  5246. select c;
  5247. var translatedQuery = MongoQueryTranslator.Translate(query);
  5248. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5249. Assert.AreSame(_collection, translatedQuery.Collection);
  5250. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5251. var selectQuery = (SelectQuery)translatedQuery;
  5252. Assert.AreEqual("(C c) => (c.S.ToUpperInvariant() != \"abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5253. Assert.IsNull(selectQuery.OrderBy);
  5254. Assert.IsNull(selectQuery.Projection);
  5255. Assert.IsNull(selectQuery.Skip);
  5256. Assert.IsNull(selectQuery.Take);
  5257. Assert.AreEqual("{ }", selectQuery.BuildQuery().ToJson());
  5258. Assert.AreEqual(5, Consume(query));
  5259. }
  5260. [Test]
  5261. public void TestWhereSToUpperInvariantEqualsConstantMixedCaseValue()
  5262. {
  5263. var query = from c in _collection.AsQueryable<C>()
  5264. where c.S.ToUpperInvariant() == "Abc"
  5265. select c;
  5266. var translatedQuery = MongoQueryTranslator.Translate(query);
  5267. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5268. Assert.AreSame(_collection, translatedQuery.Collection);
  5269. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5270. var selectQuery = (SelectQuery)translatedQuery;
  5271. Assert.AreEqual("(C c) => (c.S.ToUpperInvariant() == \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5272. Assert.IsNull(selectQuery.OrderBy);
  5273. Assert.IsNull(selectQuery.Projection);
  5274. Assert.IsNull(selectQuery.Skip);
  5275. Assert.IsNull(selectQuery.Take);
  5276. Assert.AreEqual("{ \"_id\" : { \"$type\" : -1 } }", selectQuery.BuildQuery().ToJson());
  5277. Assert.AreEqual(0, Consume(query));
  5278. }
  5279. [Test]
  5280. public void TestWhereSToUpperInvariantDoesNotEqualConstantMixedCaseValue()
  5281. {
  5282. var query = from c in _collection.AsQueryable<C>()
  5283. where c.S.ToUpperInvariant() != "Abc"
  5284. select c;
  5285. var translatedQuery = MongoQueryTranslator.Translate(query);
  5286. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5287. Assert.AreSame(_collection, translatedQuery.Collection);
  5288. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5289. var selectQuery = (SelectQuery)translatedQuery;
  5290. Assert.AreEqual("(C c) => (c.S.ToUpperInvariant() != \"Abc\")", ExpressionFormatter.ToString(selectQuery.Where));
  5291. Assert.IsNull(selectQuery.OrderBy);
  5292. Assert.IsNull(selectQuery.Projection);
  5293. Assert.IsNull(selectQuery.Skip);
  5294. Assert.IsNull(selectQuery.Take);
  5295. Assert.AreEqual("{ }", selectQuery.BuildQuery().ToJson());
  5296. Assert.AreEqual(5, Consume(query));
  5297. }
  5298. [Test]
  5299. public void TestWhereSToUpperInvariantEqualsNullValue()
  5300. {
  5301. var query = from c in _collection.AsQueryable<C>()
  5302. where c.S.ToUpperInvariant() == null
  5303. select c;
  5304. var translatedQuery = MongoQueryTranslator.Translate(query);
  5305. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5306. Assert.AreSame(_collection, translatedQuery.Collection);
  5307. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5308. var selectQuery = (SelectQuery)translatedQuery;
  5309. Assert.AreEqual("(C c) => (c.S.ToUpperInvariant() == null)", ExpressionFormatter.ToString(selectQuery.Where));
  5310. Assert.IsNull(selectQuery.OrderBy);
  5311. Assert.IsNull(selectQuery.Projection);
  5312. Assert.IsNull(selectQuery.Skip);
  5313. Assert.IsNull(selectQuery.Take);
  5314. Assert.AreEqual("{ \"s\" : null }", selectQuery.BuildQuery().ToJson());
  5315. Assert.AreEqual(3, Consume(query));
  5316. }
  5317. [Test]
  5318. public void TestWhereSToUpperInvariantDoesNotEqualNullValue()
  5319. {
  5320. var query = from c in _collection.AsQueryable<C>()
  5321. where c.S.ToUpperInvariant() != null
  5322. select c;
  5323. var translatedQuery = MongoQueryTranslator.Translate(query);
  5324. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5325. Assert.AreSame(_collection, translatedQuery.Collection);
  5326. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5327. var selectQuery = (SelectQuery)translatedQuery;
  5328. Assert.AreEqual("(C c) => (c.S.ToUpperInvariant() != null)", ExpressionFormatter.ToString(selectQuery.Where));
  5329. Assert.IsNull(selectQuery.OrderBy);
  5330. Assert.IsNull(selectQuery.Projection);
  5331. Assert.IsNull(selectQuery.Skip);
  5332. Assert.IsNull(selectQuery.Take);
  5333. Assert.AreEqual("{ \"s\" : { \"$ne\" : null } }", selectQuery.BuildQuery().ToJson());
  5334. Assert.AreEqual(2, Consume(query));
  5335. }
  5336. [Test]
  5337. public void TestWhereSystemProfileInfoDurationGreatherThan10Seconds()
  5338. {
  5339. var query = from pi in _systemProfileCollection.AsQueryable<SystemProfileInfo>()
  5340. where pi.Duration > TimeSpan.FromSeconds(10)
  5341. select pi;
  5342. var translatedQuery = MongoQueryTranslator.Translate(query);
  5343. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5344. Assert.AreSame(_systemProfileCollection, translatedQuery.Collection);
  5345. Assert.AreSame(typeof(SystemProfileInfo), translatedQuery.DocumentType);
  5346. var selectQuery = (SelectQuery)translatedQuery;
  5347. Assert.AreEqual("(SystemProfileInfo pi) => (pi.Duration > TimeSpan:(00:00:10))", ExpressionFormatter.ToString(selectQuery.Where));
  5348. Assert.IsNull(selectQuery.OrderBy);
  5349. Assert.IsNull(selectQuery.Projection);
  5350. Assert.IsNull(selectQuery.Skip);
  5351. Assert.IsNull(selectQuery.Take);
  5352. Assert.AreEqual("{ \"millis\" : { \"$gt\" : 10000.0 } }", selectQuery.BuildQuery().ToJson());
  5353. }
  5354. [Test]
  5355. public void TestWhereSystemProfileInfoNamespaceEqualsNs()
  5356. {
  5357. var query = from pi in _systemProfileCollection.AsQueryable<SystemProfileInfo>()
  5358. where pi.Namespace == "ns"
  5359. select pi;
  5360. var translatedQuery = MongoQueryTranslator.Translate(query);
  5361. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5362. Assert.AreSame(_systemProfileCollection, translatedQuery.Collection);
  5363. Assert.AreSame(typeof(SystemProfileInfo), translatedQuery.DocumentType);
  5364. var selectQuery = (SelectQuery)translatedQuery;
  5365. Assert.AreEqual("(SystemProfileInfo pi) => (pi.Namespace == \"ns\")", ExpressionFormatter.ToString(selectQuery.Where));
  5366. Assert.IsNull(selectQuery.OrderBy);
  5367. Assert.IsNull(selectQuery.Projection);
  5368. Assert.IsNull(selectQuery.Skip);
  5369. Assert.IsNull(selectQuery.Take);
  5370. Assert.AreEqual("{ \"ns\" : \"ns\" }", selectQuery.BuildQuery().ToJson());
  5371. }
  5372. [Test]
  5373. public void TestWhereSystemProfileInfoNumberScannedGreaterThan1000()
  5374. {
  5375. var query = from pi in _systemProfileCollection.AsQueryable<SystemProfileInfo>()
  5376. where pi.NumberScanned > 1000
  5377. select pi;
  5378. var translatedQuery = MongoQueryTranslator.Translate(query);
  5379. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5380. Assert.AreSame(_systemProfileCollection, translatedQuery.Collection);
  5381. Assert.AreSame(typeof(SystemProfileInfo), translatedQuery.DocumentType);
  5382. var selectQuery = (SelectQuery)translatedQuery;
  5383. Assert.AreEqual("(SystemProfileInfo pi) => (pi.NumberScanned > 1000)", ExpressionFormatter.ToString(selectQuery.Where));
  5384. Assert.IsNull(selectQuery.OrderBy);
  5385. Assert.IsNull(selectQuery.Projection);
  5386. Assert.IsNull(selectQuery.Skip);
  5387. Assert.IsNull(selectQuery.Take);
  5388. Assert.AreEqual("{ \"nscanned\" : { \"$gt\" : 1000 } }", selectQuery.BuildQuery().ToJson());
  5389. }
  5390. [Test]
  5391. public void TestWhereSystemProfileInfoTimeStampGreatherThanJan12012()
  5392. {
  5393. var query = from pi in _systemProfileCollection.AsQueryable<SystemProfileInfo>()
  5394. where pi.Timestamp > new DateTime(2012, 1, 1, 0, 0, 0, DateTimeKind.Utc)
  5395. select pi;
  5396. var translatedQuery = MongoQueryTranslator.Translate(query);
  5397. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5398. Assert.AreSame(_systemProfileCollection, translatedQuery.Collection);
  5399. Assert.AreSame(typeof(SystemProfileInfo), translatedQuery.DocumentType);
  5400. var selectQuery = (SelectQuery)translatedQuery;
  5401. Assert.AreEqual("(SystemProfileInfo pi) => (pi.Timestamp > DateTime:(2012-01-01T00:00:00Z))", ExpressionFormatter.ToString(selectQuery.Where));
  5402. Assert.IsNull(selectQuery.OrderBy);
  5403. Assert.IsNull(selectQuery.Projection);
  5404. Assert.IsNull(selectQuery.Skip);
  5405. Assert.IsNull(selectQuery.Take);
  5406. Assert.AreEqual("{ \"ts\" : { \"$gt\" : ISODate(\"2012-01-01T00:00:00Z\") } }", selectQuery.BuildQuery().ToJson());
  5407. }
  5408. [Test]
  5409. public void TestWhereTripleAnd()
  5410. {
  5411. if (_server.BuildInfo.Version >= new Version(2, 0))
  5412. {
  5413. // the query is a bit odd in order to force the built query to be promoted to $and form
  5414. var query = from c in _collection.AsQueryable<C>()
  5415. where c.X >= 0 && c.X >= 1 && c.Y == 11
  5416. select c;
  5417. var translatedQuery = MongoQueryTranslator.Translate(query);
  5418. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5419. Assert.AreSame(_collection, translatedQuery.Collection);
  5420. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5421. var selectQuery = (SelectQuery)translatedQuery;
  5422. Assert.AreEqual("(C c) => (((c.X >= 0) && (c.X >= 1)) && (c.Y == 11))", ExpressionFormatter.ToString(selectQuery.Where));
  5423. Assert.IsNull(selectQuery.OrderBy);
  5424. Assert.IsNull(selectQuery.Projection);
  5425. Assert.IsNull(selectQuery.Skip);
  5426. Assert.IsNull(selectQuery.Take);
  5427. Assert.AreEqual("{ \"$and\" : [{ \"x\" : { \"$gte\" : 0 } }, { \"x\" : { \"$gte\" : 1 } }, { \"y\" : 11 }] }", selectQuery.BuildQuery().ToJson());
  5428. Assert.AreEqual(2, Consume(query));
  5429. }
  5430. }
  5431. [Test]
  5432. public void TestWhereTripleOr()
  5433. {
  5434. var query = from c in _collection.AsQueryable<C>()
  5435. where c.X == 1 || c.Y == 33 || c.S == "x is 1"
  5436. select c;
  5437. var translatedQuery = MongoQueryTranslator.Translate(query);
  5438. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5439. Assert.AreSame(_collection, translatedQuery.Collection);
  5440. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5441. var selectQuery = (SelectQuery)translatedQuery;
  5442. Assert.AreEqual("(C c) => (((c.X == 1) || (c.Y == 33)) || (c.S == \"x is 1\"))", ExpressionFormatter.ToString(selectQuery.Where));
  5443. Assert.IsNull(selectQuery.OrderBy);
  5444. Assert.IsNull(selectQuery.Projection);
  5445. Assert.IsNull(selectQuery.Skip);
  5446. Assert.IsNull(selectQuery.Take);
  5447. Assert.AreEqual("{ \"$or\" : [{ \"x\" : 1 }, { \"y\" : 33 }, { \"s\" : \"x is 1\" }] }", selectQuery.BuildQuery().ToJson());
  5448. Assert.AreEqual(2, Consume(query));
  5449. }
  5450. [Test]
  5451. [ExpectedException(typeof(NotSupportedException), ExpectedMessage = "The indexed version of the Where query operator is not supported.")]
  5452. public void TestWhereWithIndex()
  5453. {
  5454. var query = _collection.AsQueryable<C>().Where((c, i) => true);
  5455. query.ToList(); // execute query
  5456. }
  5457. [Test]
  5458. public void TestWhereXEquals1()
  5459. {
  5460. var query = from c in _collection.AsQueryable<C>()
  5461. where c.X == 1
  5462. select c;
  5463. var translatedQuery = MongoQueryTranslator.Translate(query);
  5464. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5465. Assert.AreSame(_collection, translatedQuery.Collection);
  5466. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5467. var selectQuery = (SelectQuery)translatedQuery;
  5468. Assert.AreEqual("(C c) => (c.X == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5469. Assert.IsNull(selectQuery.OrderBy);
  5470. Assert.IsNull(selectQuery.Projection);
  5471. Assert.IsNull(selectQuery.Skip);
  5472. Assert.IsNull(selectQuery.Take);
  5473. Assert.AreEqual("{ \"x\" : 1 }", selectQuery.BuildQuery().ToJson());
  5474. Assert.AreEqual(1, Consume(query));
  5475. }
  5476. [Test]
  5477. public void TestWhereXEquals1AndYEquals11()
  5478. {
  5479. var query = from c in _collection.AsQueryable<C>()
  5480. where c.X == 1 & c.Y == 11
  5481. select c;
  5482. var translatedQuery = MongoQueryTranslator.Translate(query);
  5483. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5484. Assert.AreSame(_collection, translatedQuery.Collection);
  5485. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5486. var selectQuery = (SelectQuery)translatedQuery;
  5487. Assert.AreEqual("(C c) => ((c.X == 1) & (c.Y == 11))", ExpressionFormatter.ToString(selectQuery.Where));
  5488. Assert.IsNull(selectQuery.OrderBy);
  5489. Assert.IsNull(selectQuery.Projection);
  5490. Assert.IsNull(selectQuery.Skip);
  5491. Assert.IsNull(selectQuery.Take);
  5492. Assert.AreEqual("{ \"x\" : 1, \"y\" : 11 }", selectQuery.BuildQuery().ToJson());
  5493. Assert.AreEqual(1, Consume(query));
  5494. }
  5495. [Test]
  5496. public void TestWhereXEquals1AndAlsoYEquals11()
  5497. {
  5498. var query = from c in _collection.AsQueryable<C>()
  5499. where c.X == 1 && c.Y == 11
  5500. select c;
  5501. var translatedQuery = MongoQueryTranslator.Translate(query);
  5502. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5503. Assert.AreSame(_collection, translatedQuery.Collection);
  5504. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5505. var selectQuery = (SelectQuery)translatedQuery;
  5506. Assert.AreEqual("(C c) => ((c.X == 1) && (c.Y == 11))", ExpressionFormatter.ToString(selectQuery.Where));
  5507. Assert.IsNull(selectQuery.OrderBy);
  5508. Assert.IsNull(selectQuery.Projection);
  5509. Assert.IsNull(selectQuery.Skip);
  5510. Assert.IsNull(selectQuery.Take);
  5511. Assert.AreEqual("{ \"x\" : 1, \"y\" : 11 }", selectQuery.BuildQuery().ToJson());
  5512. Assert.AreEqual(1, Consume(query));
  5513. }
  5514. [Test]
  5515. public void TestWhereXEquals1AndYEquals11UsingTwoWhereClauses()
  5516. {
  5517. // note: using different variable names in the two where clauses to test parameter replacement when combining predicates
  5518. var query = _collection.AsQueryable<C>().Where(c => c.X == 1).Where(d => d.Y == 11);
  5519. var translatedQuery = MongoQueryTranslator.Translate(query);
  5520. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5521. Assert.AreSame(_collection, translatedQuery.Collection);
  5522. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5523. var selectQuery = (SelectQuery)translatedQuery;
  5524. Assert.AreEqual("(C c) => ((c.X == 1) && (c.Y == 11))", ExpressionFormatter.ToString(selectQuery.Where)); // note parameter replacement from c to d in second clause
  5525. Assert.IsNull(selectQuery.OrderBy);
  5526. Assert.IsNull(selectQuery.Projection);
  5527. Assert.IsNull(selectQuery.Skip);
  5528. Assert.IsNull(selectQuery.Take);
  5529. Assert.AreEqual("{ \"x\" : 1, \"y\" : 11 }", selectQuery.BuildQuery().ToJson());
  5530. Assert.AreEqual(1, Consume(query));
  5531. }
  5532. [Test]
  5533. public void TestWhereXEquals1AndYEquals11Not()
  5534. {
  5535. var query = from c in _collection.AsQueryable<C>()
  5536. where !(c.X == 1 && c.Y == 11)
  5537. select c;
  5538. var translatedQuery = MongoQueryTranslator.Translate(query);
  5539. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5540. Assert.AreSame(_collection, translatedQuery.Collection);
  5541. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5542. var selectQuery = (SelectQuery)translatedQuery;
  5543. Assert.AreEqual("(C c) => !((c.X == 1) && (c.Y == 11))", ExpressionFormatter.ToString(selectQuery.Where));
  5544. Assert.IsNull(selectQuery.OrderBy);
  5545. Assert.IsNull(selectQuery.Projection);
  5546. Assert.IsNull(selectQuery.Skip);
  5547. Assert.IsNull(selectQuery.Take);
  5548. Assert.AreEqual("{ \"$nor\" : [{ \"x\" : 1, \"y\" : 11 }] }", selectQuery.BuildQuery().ToJson());
  5549. Assert.AreEqual(4, Consume(query));
  5550. }
  5551. [Test]
  5552. public void TestWhereXEquals1AndYEquals11AndZEquals11()
  5553. {
  5554. var query = from c in _collection.AsQueryable<C>()
  5555. where c.X == 1 && c.Y == 11 && c.D.Z == 11
  5556. select c;
  5557. var translatedQuery = MongoQueryTranslator.Translate(query);
  5558. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5559. Assert.AreSame(_collection, translatedQuery.Collection);
  5560. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5561. var selectQuery = (SelectQuery)translatedQuery;
  5562. Assert.AreEqual("(C c) => (((c.X == 1) && (c.Y == 11)) && (c.D.Z == 11))", ExpressionFormatter.ToString(selectQuery.Where));
  5563. Assert.IsNull(selectQuery.OrderBy);
  5564. Assert.IsNull(selectQuery.Projection);
  5565. Assert.IsNull(selectQuery.Skip);
  5566. Assert.IsNull(selectQuery.Take);
  5567. Assert.AreEqual("{ \"x\" : 1, \"y\" : 11, \"d.z\" : 11 }", selectQuery.BuildQuery().ToJson());
  5568. Assert.AreEqual(1, Consume(query));
  5569. }
  5570. [Test]
  5571. public void TestWhereXEquals1Not()
  5572. {
  5573. var query = from c in _collection.AsQueryable<C>()
  5574. where !(c.X == 1)
  5575. select c;
  5576. var translatedQuery = MongoQueryTranslator.Translate(query);
  5577. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5578. Assert.AreSame(_collection, translatedQuery.Collection);
  5579. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5580. var selectQuery = (SelectQuery)translatedQuery;
  5581. Assert.AreEqual("(C c) => !(c.X == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5582. Assert.IsNull(selectQuery.OrderBy);
  5583. Assert.IsNull(selectQuery.Projection);
  5584. Assert.IsNull(selectQuery.Skip);
  5585. Assert.IsNull(selectQuery.Take);
  5586. Assert.AreEqual("{ \"x\" : { \"$ne\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5587. Assert.AreEqual(4, Consume(query));
  5588. }
  5589. [Test]
  5590. public void TestWhereXEquals1OrYEquals33()
  5591. {
  5592. var query = from c in _collection.AsQueryable<C>()
  5593. where c.X == 1 | c.Y == 33
  5594. select c;
  5595. var translatedQuery = MongoQueryTranslator.Translate(query);
  5596. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5597. Assert.AreSame(_collection, translatedQuery.Collection);
  5598. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5599. var selectQuery = (SelectQuery)translatedQuery;
  5600. Assert.AreEqual("(C c) => ((c.X == 1) | (c.Y == 33))", ExpressionFormatter.ToString(selectQuery.Where));
  5601. Assert.IsNull(selectQuery.OrderBy);
  5602. Assert.IsNull(selectQuery.Projection);
  5603. Assert.IsNull(selectQuery.Skip);
  5604. Assert.IsNull(selectQuery.Take);
  5605. Assert.AreEqual("{ \"$or\" : [{ \"x\" : 1 }, { \"y\" : 33 }] }", selectQuery.BuildQuery().ToJson());
  5606. Assert.AreEqual(2, Consume(query));
  5607. }
  5608. [Test]
  5609. public void TestWhereXEquals1OrElseYEquals33()
  5610. {
  5611. var query = from c in _collection.AsQueryable<C>()
  5612. where c.X == 1 || c.Y == 33
  5613. select c;
  5614. var translatedQuery = MongoQueryTranslator.Translate(query);
  5615. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5616. Assert.AreSame(_collection, translatedQuery.Collection);
  5617. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5618. var selectQuery = (SelectQuery)translatedQuery;
  5619. Assert.AreEqual("(C c) => ((c.X == 1) || (c.Y == 33))", ExpressionFormatter.ToString(selectQuery.Where));
  5620. Assert.IsNull(selectQuery.OrderBy);
  5621. Assert.IsNull(selectQuery.Projection);
  5622. Assert.IsNull(selectQuery.Skip);
  5623. Assert.IsNull(selectQuery.Take);
  5624. Assert.AreEqual("{ \"$or\" : [{ \"x\" : 1 }, { \"y\" : 33 }] }", selectQuery.BuildQuery().ToJson());
  5625. Assert.AreEqual(2, Consume(query));
  5626. }
  5627. [Test]
  5628. public void TestWhereXEquals1OrYEquals33Not()
  5629. {
  5630. var query = from c in _collection.AsQueryable<C>()
  5631. where !(c.X == 1 || c.Y == 33)
  5632. select c;
  5633. var translatedQuery = MongoQueryTranslator.Translate(query);
  5634. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5635. Assert.AreSame(_collection, translatedQuery.Collection);
  5636. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5637. var selectQuery = (SelectQuery)translatedQuery;
  5638. Assert.AreEqual("(C c) => !((c.X == 1) || (c.Y == 33))", ExpressionFormatter.ToString(selectQuery.Where));
  5639. Assert.IsNull(selectQuery.OrderBy);
  5640. Assert.IsNull(selectQuery.Projection);
  5641. Assert.IsNull(selectQuery.Skip);
  5642. Assert.IsNull(selectQuery.Take);
  5643. Assert.AreEqual("{ \"$nor\" : [{ \"x\" : 1 }, { \"y\" : 33 }] }", selectQuery.BuildQuery().ToJson());
  5644. Assert.AreEqual(3, Consume(query));
  5645. }
  5646. [Test]
  5647. public void TestWhereXEquals1OrYEquals33NotNot()
  5648. {
  5649. var query = from c in _collection.AsQueryable<C>()
  5650. where !!(c.X == 1 || c.Y == 33)
  5651. select c;
  5652. var translatedQuery = MongoQueryTranslator.Translate(query);
  5653. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5654. Assert.AreSame(_collection, translatedQuery.Collection);
  5655. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5656. var selectQuery = (SelectQuery)translatedQuery;
  5657. Assert.AreEqual("(C c) => !!((c.X == 1) || (c.Y == 33))", ExpressionFormatter.ToString(selectQuery.Where));
  5658. Assert.IsNull(selectQuery.OrderBy);
  5659. Assert.IsNull(selectQuery.Projection);
  5660. Assert.IsNull(selectQuery.Skip);
  5661. Assert.IsNull(selectQuery.Take);
  5662. Assert.AreEqual("{ \"$or\" : [{ \"x\" : 1 }, { \"y\" : 33 }] }", selectQuery.BuildQuery().ToJson());
  5663. Assert.AreEqual(2, Consume(query));
  5664. }
  5665. [Test]
  5666. public void TestWhereXEquals1UsingJavaScript()
  5667. {
  5668. var query = from c in _collection.AsQueryable<C>()
  5669. where c.X == 1 && Query.Where("this.x < 9").Inject()
  5670. select c;
  5671. var translatedQuery = MongoQueryTranslator.Translate(query);
  5672. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5673. Assert.AreSame(_collection, translatedQuery.Collection);
  5674. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5675. var selectQuery = (SelectQuery)translatedQuery;
  5676. Assert.AreEqual("(C c) => ((c.X == 1) && LinqToMongo.Inject({ \"$where\" : { \"$code\" : \"this.x < 9\" } }))", ExpressionFormatter.ToString(selectQuery.Where));
  5677. Assert.IsNull(selectQuery.OrderBy);
  5678. Assert.IsNull(selectQuery.Projection);
  5679. Assert.IsNull(selectQuery.Skip);
  5680. Assert.IsNull(selectQuery.Take);
  5681. Assert.AreEqual("{ \"x\" : 1, \"$where\" : { \"$code\" : \"this.x < 9\" } }", selectQuery.BuildQuery().ToJson());
  5682. Assert.AreEqual(1, Consume(query));
  5683. }
  5684. [Test]
  5685. public void TestWhereXGreaterThan1()
  5686. {
  5687. var query = from c in _collection.AsQueryable<C>()
  5688. where c.X > 1
  5689. select c;
  5690. var translatedQuery = MongoQueryTranslator.Translate(query);
  5691. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5692. Assert.AreSame(_collection, translatedQuery.Collection);
  5693. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5694. var selectQuery = (SelectQuery)translatedQuery;
  5695. Assert.AreEqual("(C c) => (c.X > 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5696. Assert.IsNull(selectQuery.OrderBy);
  5697. Assert.IsNull(selectQuery.Projection);
  5698. Assert.IsNull(selectQuery.Skip);
  5699. Assert.IsNull(selectQuery.Take);
  5700. Assert.AreEqual("{ \"x\" : { \"$gt\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5701. Assert.AreEqual(4, Consume(query));
  5702. }
  5703. [Test]
  5704. public void TestWhereXGreaterThan1AndLessThan3()
  5705. {
  5706. var query = from c in _collection.AsQueryable<C>()
  5707. where c.X > 1 && c.X < 3
  5708. select c;
  5709. var translatedQuery = MongoQueryTranslator.Translate(query);
  5710. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5711. Assert.AreSame(_collection, translatedQuery.Collection);
  5712. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5713. var selectQuery = (SelectQuery)translatedQuery;
  5714. Assert.AreEqual("(C c) => ((c.X > 1) && (c.X < 3))", ExpressionFormatter.ToString(selectQuery.Where));
  5715. Assert.IsNull(selectQuery.OrderBy);
  5716. Assert.IsNull(selectQuery.Projection);
  5717. Assert.IsNull(selectQuery.Skip);
  5718. Assert.IsNull(selectQuery.Take);
  5719. Assert.AreEqual("{ \"x\" : { \"$gt\" : 1, \"$lt\" : 3 } }", selectQuery.BuildQuery().ToJson());
  5720. Assert.AreEqual(1, Consume(query));
  5721. }
  5722. [Test]
  5723. public void TestWhereXGreaterThan1AndLessThan3Not()
  5724. {
  5725. var query = from c in _collection.AsQueryable<C>()
  5726. where !(c.X > 1 && c.X < 3)
  5727. select c;
  5728. var translatedQuery = MongoQueryTranslator.Translate(query);
  5729. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5730. Assert.AreSame(_collection, translatedQuery.Collection);
  5731. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5732. var selectQuery = (SelectQuery)translatedQuery;
  5733. Assert.AreEqual("(C c) => !((c.X > 1) && (c.X < 3))", ExpressionFormatter.ToString(selectQuery.Where));
  5734. Assert.IsNull(selectQuery.OrderBy);
  5735. Assert.IsNull(selectQuery.Projection);
  5736. Assert.IsNull(selectQuery.Skip);
  5737. Assert.IsNull(selectQuery.Take);
  5738. Assert.AreEqual("{ \"$nor\" : [{ \"x\" : { \"$gt\" : 1, \"$lt\" : 3 } }] }", selectQuery.BuildQuery().ToJson());
  5739. Assert.AreEqual(4, Consume(query));
  5740. }
  5741. [Test]
  5742. public void TestWhereXGreaterThan1Not()
  5743. {
  5744. var query = from c in _collection.AsQueryable<C>()
  5745. where !(c.X > 1)
  5746. select c;
  5747. var translatedQuery = MongoQueryTranslator.Translate(query);
  5748. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5749. Assert.AreSame(_collection, translatedQuery.Collection);
  5750. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5751. var selectQuery = (SelectQuery)translatedQuery;
  5752. Assert.AreEqual("(C c) => !(c.X > 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5753. Assert.IsNull(selectQuery.OrderBy);
  5754. Assert.IsNull(selectQuery.Projection);
  5755. Assert.IsNull(selectQuery.Skip);
  5756. Assert.IsNull(selectQuery.Take);
  5757. Assert.AreEqual("{ \"x\" : { \"$not\" : { \"$gt\" : 1 } } }", selectQuery.BuildQuery().ToJson());
  5758. Assert.AreEqual(1, Consume(query));
  5759. }
  5760. [Test]
  5761. public void TestWhereXGreaterThan1Reversed()
  5762. {
  5763. var query = from c in _collection.AsQueryable<C>()
  5764. where 1 < c.X
  5765. select c;
  5766. var translatedQuery = MongoQueryTranslator.Translate(query);
  5767. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5768. Assert.AreSame(_collection, translatedQuery.Collection);
  5769. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5770. var selectQuery = (SelectQuery)translatedQuery;
  5771. Assert.AreEqual("(C c) => (c.X > 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5772. Assert.IsNull(selectQuery.OrderBy);
  5773. Assert.IsNull(selectQuery.Projection);
  5774. Assert.IsNull(selectQuery.Skip);
  5775. Assert.IsNull(selectQuery.Take);
  5776. Assert.AreEqual("{ \"x\" : { \"$gt\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5777. Assert.AreEqual(4, Consume(query));
  5778. }
  5779. [Test]
  5780. public void TestWhereXGreaterThanOrEquals1()
  5781. {
  5782. var query = from c in _collection.AsQueryable<C>()
  5783. where c.X >= 1
  5784. select c;
  5785. var translatedQuery = MongoQueryTranslator.Translate(query);
  5786. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5787. Assert.AreSame(_collection, translatedQuery.Collection);
  5788. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5789. var selectQuery = (SelectQuery)translatedQuery;
  5790. Assert.AreEqual("(C c) => (c.X >= 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5791. Assert.IsNull(selectQuery.OrderBy);
  5792. Assert.IsNull(selectQuery.Projection);
  5793. Assert.IsNull(selectQuery.Skip);
  5794. Assert.IsNull(selectQuery.Take);
  5795. Assert.AreEqual("{ \"x\" : { \"$gte\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5796. Assert.AreEqual(5, Consume(query));
  5797. }
  5798. [Test]
  5799. public void TestWhereXGreaterThanOrEquals1Not()
  5800. {
  5801. var query = from c in _collection.AsQueryable<C>()
  5802. where !(c.X >= 1)
  5803. select c;
  5804. var translatedQuery = MongoQueryTranslator.Translate(query);
  5805. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5806. Assert.AreSame(_collection, translatedQuery.Collection);
  5807. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5808. var selectQuery = (SelectQuery)translatedQuery;
  5809. Assert.AreEqual("(C c) => !(c.X >= 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5810. Assert.IsNull(selectQuery.OrderBy);
  5811. Assert.IsNull(selectQuery.Projection);
  5812. Assert.IsNull(selectQuery.Skip);
  5813. Assert.IsNull(selectQuery.Take);
  5814. Assert.AreEqual("{ \"x\" : { \"$not\" : { \"$gte\" : 1 } } }", selectQuery.BuildQuery().ToJson());
  5815. Assert.AreEqual(0, Consume(query));
  5816. }
  5817. [Test]
  5818. public void TestWhereXGreaterThanOrEquals1Reversed()
  5819. {
  5820. var query = from c in _collection.AsQueryable<C>()
  5821. where 1 <= c.X
  5822. select c;
  5823. var translatedQuery = MongoQueryTranslator.Translate(query);
  5824. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5825. Assert.AreSame(_collection, translatedQuery.Collection);
  5826. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5827. var selectQuery = (SelectQuery)translatedQuery;
  5828. Assert.AreEqual("(C c) => (c.X >= 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5829. Assert.IsNull(selectQuery.OrderBy);
  5830. Assert.IsNull(selectQuery.Projection);
  5831. Assert.IsNull(selectQuery.Skip);
  5832. Assert.IsNull(selectQuery.Take);
  5833. Assert.AreEqual("{ \"x\" : { \"$gte\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5834. Assert.AreEqual(5, Consume(query));
  5835. }
  5836. [Test]
  5837. public void TestWhereXIn1Or9()
  5838. {
  5839. var query = from c in _collection.AsQueryable<C>()
  5840. where c.X.In(new [] { 1, 9 })
  5841. select c;
  5842. var translatedQuery = MongoQueryTranslator.Translate(query);
  5843. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5844. Assert.AreSame(_collection, translatedQuery.Collection);
  5845. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5846. var selectQuery = (SelectQuery)translatedQuery;
  5847. Assert.AreEqual("(C c) => LinqToMongo.In<Int32>(c.X, Int32[]:{ 1, 9 })", ExpressionFormatter.ToString(selectQuery.Where));
  5848. Assert.IsNull(selectQuery.OrderBy);
  5849. Assert.IsNull(selectQuery.Projection);
  5850. Assert.IsNull(selectQuery.Skip);
  5851. Assert.IsNull(selectQuery.Take);
  5852. Assert.AreEqual("{ \"x\" : { \"$in\" : [1, 9] } }", selectQuery.BuildQuery().ToJson());
  5853. Assert.AreEqual(1, Consume(query));
  5854. }
  5855. [Test]
  5856. public void TestWhereXIn1Or9Not()
  5857. {
  5858. var query = from c in _collection.AsQueryable<C>()
  5859. where !c.X.In(new[] { 1, 9 })
  5860. select c;
  5861. var translatedQuery = MongoQueryTranslator.Translate(query);
  5862. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5863. Assert.AreSame(_collection, translatedQuery.Collection);
  5864. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5865. var selectQuery = (SelectQuery)translatedQuery;
  5866. Assert.AreEqual("(C c) => !LinqToMongo.In<Int32>(c.X, Int32[]:{ 1, 9 })", ExpressionFormatter.ToString(selectQuery.Where));
  5867. Assert.IsNull(selectQuery.OrderBy);
  5868. Assert.IsNull(selectQuery.Projection);
  5869. Assert.IsNull(selectQuery.Skip);
  5870. Assert.IsNull(selectQuery.Take);
  5871. Assert.AreEqual("{ \"x\" : { \"$nin\" : [1, 9] } }", selectQuery.BuildQuery().ToJson());
  5872. Assert.AreEqual(4, Consume(query));
  5873. }
  5874. [Test]
  5875. public void TestWhereXIsTypeInt32()
  5876. {
  5877. var query = from c in _collection.AsQueryable<C>()
  5878. where Query.Type("x", BsonType.Int32).Inject()
  5879. select c;
  5880. var translatedQuery = MongoQueryTranslator.Translate(query);
  5881. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5882. Assert.AreSame(_collection, translatedQuery.Collection);
  5883. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5884. var selectQuery = (SelectQuery)translatedQuery;
  5885. Assert.AreEqual("(C c) => LinqToMongo.Inject({ \"x\" : { \"$type\" : 16 } })", ExpressionFormatter.ToString(selectQuery.Where));
  5886. Assert.IsNull(selectQuery.OrderBy);
  5887. Assert.IsNull(selectQuery.Projection);
  5888. Assert.IsNull(selectQuery.Skip);
  5889. Assert.IsNull(selectQuery.Take);
  5890. Assert.AreEqual("{ \"x\" : { \"$type\" : 16 } }", selectQuery.BuildQuery().ToJson());
  5891. Assert.AreEqual(5, Consume(query));
  5892. }
  5893. [Test]
  5894. public void TestWhereXIsTypeInt32Not()
  5895. {
  5896. var query = from c in _collection.AsQueryable<C>()
  5897. where !Query.Type("x", BsonType.Int32).Inject()
  5898. select c;
  5899. var translatedQuery = MongoQueryTranslator.Translate(query);
  5900. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5901. Assert.AreSame(_collection, translatedQuery.Collection);
  5902. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5903. var selectQuery = (SelectQuery)translatedQuery;
  5904. Assert.AreEqual("(C c) => !LinqToMongo.Inject({ \"x\" : { \"$type\" : 16 } })", ExpressionFormatter.ToString(selectQuery.Where));
  5905. Assert.IsNull(selectQuery.OrderBy);
  5906. Assert.IsNull(selectQuery.Projection);
  5907. Assert.IsNull(selectQuery.Skip);
  5908. Assert.IsNull(selectQuery.Take);
  5909. Assert.AreEqual("{ \"x\" : { \"$not\" : { \"$type\" : 16 } } }", selectQuery.BuildQuery().ToJson());
  5910. Assert.AreEqual(0, Consume(query));
  5911. }
  5912. [Test]
  5913. public void TestWhereXLessThan1()
  5914. {
  5915. var query = from c in _collection.AsQueryable<C>()
  5916. where c.X < 1
  5917. select c;
  5918. var translatedQuery = MongoQueryTranslator.Translate(query);
  5919. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5920. Assert.AreSame(_collection, translatedQuery.Collection);
  5921. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5922. var selectQuery = (SelectQuery)translatedQuery;
  5923. Assert.AreEqual("(C c) => (c.X < 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5924. Assert.IsNull(selectQuery.OrderBy);
  5925. Assert.IsNull(selectQuery.Projection);
  5926. Assert.IsNull(selectQuery.Skip);
  5927. Assert.IsNull(selectQuery.Take);
  5928. Assert.AreEqual("{ \"x\" : { \"$lt\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5929. Assert.AreEqual(0, Consume(query));
  5930. }
  5931. [Test]
  5932. public void TestWhereXLessThan1Not()
  5933. {
  5934. var query = from c in _collection.AsQueryable<C>()
  5935. where !(c.X < 1)
  5936. select c;
  5937. var translatedQuery = MongoQueryTranslator.Translate(query);
  5938. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5939. Assert.AreSame(_collection, translatedQuery.Collection);
  5940. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5941. var selectQuery = (SelectQuery)translatedQuery;
  5942. Assert.AreEqual("(C c) => !(c.X < 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5943. Assert.IsNull(selectQuery.OrderBy);
  5944. Assert.IsNull(selectQuery.Projection);
  5945. Assert.IsNull(selectQuery.Skip);
  5946. Assert.IsNull(selectQuery.Take);
  5947. Assert.AreEqual("{ \"x\" : { \"$not\" : { \"$lt\" : 1 } } }", selectQuery.BuildQuery().ToJson());
  5948. Assert.AreEqual(5, Consume(query));
  5949. }
  5950. [Test]
  5951. public void TestWhereXLessThan1Reversed()
  5952. {
  5953. var query = from c in _collection.AsQueryable<C>()
  5954. where 1 > c.X
  5955. select c;
  5956. var translatedQuery = MongoQueryTranslator.Translate(query);
  5957. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5958. Assert.AreSame(_collection, translatedQuery.Collection);
  5959. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5960. var selectQuery = (SelectQuery)translatedQuery;
  5961. Assert.AreEqual("(C c) => (c.X < 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5962. Assert.IsNull(selectQuery.OrderBy);
  5963. Assert.IsNull(selectQuery.Projection);
  5964. Assert.IsNull(selectQuery.Skip);
  5965. Assert.IsNull(selectQuery.Take);
  5966. Assert.AreEqual("{ \"x\" : { \"$lt\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5967. Assert.AreEqual(0, Consume(query));
  5968. }
  5969. [Test]
  5970. public void TestWhereXLessThanOrEquals1()
  5971. {
  5972. var query = from c in _collection.AsQueryable<C>()
  5973. where c.X <= 1
  5974. select c;
  5975. var translatedQuery = MongoQueryTranslator.Translate(query);
  5976. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5977. Assert.AreSame(_collection, translatedQuery.Collection);
  5978. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5979. var selectQuery = (SelectQuery)translatedQuery;
  5980. Assert.AreEqual("(C c) => (c.X <= 1)", ExpressionFormatter.ToString(selectQuery.Where));
  5981. Assert.IsNull(selectQuery.OrderBy);
  5982. Assert.IsNull(selectQuery.Projection);
  5983. Assert.IsNull(selectQuery.Skip);
  5984. Assert.IsNull(selectQuery.Take);
  5985. Assert.AreEqual("{ \"x\" : { \"$lte\" : 1 } }", selectQuery.BuildQuery().ToJson());
  5986. Assert.AreEqual(1, Consume(query));
  5987. }
  5988. [Test]
  5989. public void TestWhereXLessThanOrEquals1Not()
  5990. {
  5991. var query = from c in _collection.AsQueryable<C>()
  5992. where !(c.X <= 1)
  5993. select c;
  5994. var translatedQuery = MongoQueryTranslator.Translate(query);
  5995. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  5996. Assert.AreSame(_collection, translatedQuery.Collection);
  5997. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  5998. var selectQuery = (SelectQuery)translatedQuery;
  5999. Assert.AreEqual("(C c) => !(c.X <= 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6000. Assert.IsNull(selectQuery.OrderBy);
  6001. Assert.IsNull(selectQuery.Projection);
  6002. Assert.IsNull(selectQuery.Skip);
  6003. Assert.IsNull(selectQuery.Take);
  6004. Assert.AreEqual("{ \"x\" : { \"$not\" : { \"$lte\" : 1 } } }", selectQuery.BuildQuery().ToJson());
  6005. Assert.AreEqual(4, Consume(query));
  6006. }
  6007. [Test]
  6008. public void TestWhereXLessThanOrEquals1Reversed()
  6009. {
  6010. var query = from c in _collection.AsQueryable<C>()
  6011. where 1 >= c.X
  6012. select c;
  6013. var translatedQuery = MongoQueryTranslator.Translate(query);
  6014. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6015. Assert.AreSame(_collection, translatedQuery.Collection);
  6016. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6017. var selectQuery = (SelectQuery)translatedQuery;
  6018. Assert.AreEqual("(C c) => (c.X <= 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6019. Assert.IsNull(selectQuery.OrderBy);
  6020. Assert.IsNull(selectQuery.Projection);
  6021. Assert.IsNull(selectQuery.Skip);
  6022. Assert.IsNull(selectQuery.Take);
  6023. Assert.AreEqual("{ \"x\" : { \"$lte\" : 1 } }", selectQuery.BuildQuery().ToJson());
  6024. Assert.AreEqual(1, Consume(query));
  6025. }
  6026. [Test]
  6027. public void TestWhereXModOneEquals0AndXModTwoEquals0()
  6028. {
  6029. if (_server.BuildInfo.Version >= new Version(2, 0))
  6030. {
  6031. var query = from c in _collection.AsQueryable<C>()
  6032. where (c.X % 1 == 0) && (c.X % 2 == 0)
  6033. select c;
  6034. var translatedQuery = MongoQueryTranslator.Translate(query);
  6035. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6036. Assert.AreSame(_collection, translatedQuery.Collection);
  6037. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6038. var selectQuery = (SelectQuery)translatedQuery;
  6039. Assert.AreEqual("(C c) => (((c.X % 1) == 0) && ((c.X % 2) == 0))", ExpressionFormatter.ToString(selectQuery.Where));
  6040. Assert.IsNull(selectQuery.OrderBy);
  6041. Assert.IsNull(selectQuery.Projection);
  6042. Assert.IsNull(selectQuery.Skip);
  6043. Assert.IsNull(selectQuery.Take);
  6044. Assert.AreEqual("{ \"$and\" : [{ \"x\" : { \"$mod\" : [1, 0] } }, { \"x\" : { \"$mod\" : [2, 0] } }] }", selectQuery.BuildQuery().ToJson());
  6045. Assert.AreEqual(2, Consume(query));
  6046. }
  6047. }
  6048. [Test]
  6049. public void TestWhereXModOneEquals0AndXModTwoEquals0Not()
  6050. {
  6051. if (_server.BuildInfo.Version >= new Version(2, 0))
  6052. {
  6053. var query = from c in _collection.AsQueryable<C>()
  6054. where !((c.X % 1 == 0) && (c.X % 2 == 0))
  6055. select c;
  6056. var translatedQuery = MongoQueryTranslator.Translate(query);
  6057. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6058. Assert.AreSame(_collection, translatedQuery.Collection);
  6059. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6060. var selectQuery = (SelectQuery)translatedQuery;
  6061. Assert.AreEqual("(C c) => !(((c.X % 1) == 0) && ((c.X % 2) == 0))", ExpressionFormatter.ToString(selectQuery.Where));
  6062. Assert.IsNull(selectQuery.OrderBy);
  6063. Assert.IsNull(selectQuery.Projection);
  6064. Assert.IsNull(selectQuery.Skip);
  6065. Assert.IsNull(selectQuery.Take);
  6066. Assert.AreEqual("{ \"$nor\" : [{ \"$and\" : [{ \"x\" : { \"$mod\" : [1, 0] } }, { \"x\" : { \"$mod\" : [2, 0] } }] }] }", selectQuery.BuildQuery().ToJson());
  6067. Assert.AreEqual(3, Consume(query));
  6068. }
  6069. }
  6070. [Test]
  6071. public void TestWhereXModOneEquals0AndXModTwoEquals0NotNot()
  6072. {
  6073. if (_server.BuildInfo.Version >= new Version(2, 0))
  6074. {
  6075. var query = from c in _collection.AsQueryable<C>()
  6076. where !!((c.X % 1 == 0) && (c.X % 2 == 0))
  6077. select c;
  6078. var translatedQuery = MongoQueryTranslator.Translate(query);
  6079. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6080. Assert.AreSame(_collection, translatedQuery.Collection);
  6081. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6082. var selectQuery = (SelectQuery)translatedQuery;
  6083. Assert.AreEqual("(C c) => !!(((c.X % 1) == 0) && ((c.X % 2) == 0))", ExpressionFormatter.ToString(selectQuery.Where));
  6084. Assert.IsNull(selectQuery.OrderBy);
  6085. Assert.IsNull(selectQuery.Projection);
  6086. Assert.IsNull(selectQuery.Skip);
  6087. Assert.IsNull(selectQuery.Take);
  6088. Assert.AreEqual("{ \"$or\" : [{ \"$and\" : [{ \"x\" : { \"$mod\" : [1, 0] } }, { \"x\" : { \"$mod\" : [2, 0] } }] }] }", selectQuery.BuildQuery().ToJson());
  6089. Assert.AreEqual(2, Consume(query));
  6090. }
  6091. }
  6092. [Test]
  6093. public void TestWhereXModTwoEquals1()
  6094. {
  6095. var query = from c in _collection.AsQueryable<C>()
  6096. where c.X % 2 == 1
  6097. select c;
  6098. var translatedQuery = MongoQueryTranslator.Translate(query);
  6099. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6100. Assert.AreSame(_collection, translatedQuery.Collection);
  6101. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6102. var selectQuery = (SelectQuery)translatedQuery;
  6103. Assert.AreEqual("(C c) => ((c.X % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6104. Assert.IsNull(selectQuery.OrderBy);
  6105. Assert.IsNull(selectQuery.Projection);
  6106. Assert.IsNull(selectQuery.Skip);
  6107. Assert.IsNull(selectQuery.Take);
  6108. Assert.AreEqual("{ \"x\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  6109. Assert.AreEqual(3, Consume(query));
  6110. }
  6111. [Test]
  6112. public void TestWhereXModTwoEquals1Not()
  6113. {
  6114. var query = from c in _collection.AsQueryable<C>()
  6115. where !(c.X % 2 == 1)
  6116. select c;
  6117. var translatedQuery = MongoQueryTranslator.Translate(query);
  6118. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6119. Assert.AreSame(_collection, translatedQuery.Collection);
  6120. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6121. var selectQuery = (SelectQuery)translatedQuery;
  6122. Assert.AreEqual("(C c) => !((c.X % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6123. Assert.IsNull(selectQuery.OrderBy);
  6124. Assert.IsNull(selectQuery.Projection);
  6125. Assert.IsNull(selectQuery.Skip);
  6126. Assert.IsNull(selectQuery.Take);
  6127. Assert.AreEqual("{ \"x\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  6128. Assert.AreEqual(2, Consume(query));
  6129. }
  6130. [Test]
  6131. public void TestWhereXModTwoEquals1Reversed()
  6132. {
  6133. var query = from c in _collection.AsQueryable<C>()
  6134. where 1 == c.X % 2
  6135. select c;
  6136. var translatedQuery = MongoQueryTranslator.Translate(query);
  6137. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6138. Assert.AreSame(_collection, translatedQuery.Collection);
  6139. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6140. var selectQuery = (SelectQuery)translatedQuery;
  6141. Assert.AreEqual("(C c) => ((c.X % 2) == 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6142. Assert.IsNull(selectQuery.OrderBy);
  6143. Assert.IsNull(selectQuery.Projection);
  6144. Assert.IsNull(selectQuery.Skip);
  6145. Assert.IsNull(selectQuery.Take);
  6146. Assert.AreEqual("{ \"x\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  6147. Assert.AreEqual(3, Consume(query));
  6148. }
  6149. [Test]
  6150. public void TestWhereXModTwoNotEquals1()
  6151. {
  6152. var query = from c in _collection.AsQueryable<C>()
  6153. where c.X % 2 != 1
  6154. select c;
  6155. var translatedQuery = MongoQueryTranslator.Translate(query);
  6156. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6157. Assert.AreSame(_collection, translatedQuery.Collection);
  6158. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6159. var selectQuery = (SelectQuery)translatedQuery;
  6160. Assert.AreEqual("(C c) => ((c.X % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6161. Assert.IsNull(selectQuery.OrderBy);
  6162. Assert.IsNull(selectQuery.Projection);
  6163. Assert.IsNull(selectQuery.Skip);
  6164. Assert.IsNull(selectQuery.Take);
  6165. Assert.AreEqual("{ \"x\" : { \"$not\" : { \"$mod\" : [2, 1] } } }", selectQuery.BuildQuery().ToJson());
  6166. Assert.AreEqual(2, Consume(query));
  6167. }
  6168. [Test]
  6169. public void TestWhereXModTwoNotEquals1Not()
  6170. {
  6171. var query = from c in _collection.AsQueryable<C>()
  6172. where !(c.X % 2 != 1)
  6173. select c;
  6174. var translatedQuery = MongoQueryTranslator.Translate(query);
  6175. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6176. Assert.AreSame(_collection, translatedQuery.Collection);
  6177. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6178. var selectQuery = (SelectQuery)translatedQuery;
  6179. Assert.AreEqual("(C c) => !((c.X % 2) != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6180. Assert.IsNull(selectQuery.OrderBy);
  6181. Assert.IsNull(selectQuery.Projection);
  6182. Assert.IsNull(selectQuery.Skip);
  6183. Assert.IsNull(selectQuery.Take);
  6184. Assert.AreEqual("{ \"x\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
  6185. Assert.AreEqual(3, Consume(query));
  6186. }
  6187. [Test]
  6188. public void TestWhereXNotEquals1()
  6189. {
  6190. var query = from c in _collection.AsQueryable<C>()
  6191. where c.X != 1
  6192. select c;
  6193. var translatedQuery = MongoQueryTranslator.Translate(query);
  6194. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6195. Assert.AreSame(_collection, translatedQuery.Collection);
  6196. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6197. var selectQuery = (SelectQuery)translatedQuery;
  6198. Assert.AreEqual("(C c) => (c.X != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6199. Assert.IsNull(selectQuery.OrderBy);
  6200. Assert.IsNull(selectQuery.Projection);
  6201. Assert.IsNull(selectQuery.Skip);
  6202. Assert.IsNull(selectQuery.Take);
  6203. Assert.AreEqual("{ \"x\" : { \"$ne\" : 1 } }", selectQuery.BuildQuery().ToJson());
  6204. Assert.AreEqual(4, Consume(query));
  6205. }
  6206. [Test]
  6207. public void TestWhereXNotEquals1Not()
  6208. {
  6209. var query = from c in _collection.AsQueryable<C>()
  6210. where !(c.X != 1)
  6211. select c;
  6212. var translatedQuery = MongoQueryTranslator.Translate(query);
  6213. Assert.IsInstanceOf<SelectQuery>(translatedQuery);
  6214. Assert.AreSame(_collection, translatedQuery.Collection);
  6215. Assert.AreSame(typeof(C), translatedQuery.DocumentType);
  6216. var selectQuery = (SelectQuery)translatedQuery;
  6217. Assert.AreEqual("(C c) => !(c.X != 1)", ExpressionFormatter.ToString(selectQuery.Where));
  6218. Assert.IsNull(selectQuery.OrderBy);
  6219. Assert.IsNull(selectQuery.Projection);
  6220. Assert.IsNull(selectQuery.Skip);
  6221. Assert.IsNull(selectQuery.Take);
  6222. Assert.AreEqual("{ \"x\" : 1 }", selectQuery.BuildQuery().ToJson());
  6223. Assert.AreEqual(1, Consume(query));
  6224. }
  6225. private int Consume<T>(IQueryable<T> query)
  6226. {
  6227. var count = 0;
  6228. foreach (var c in query)
  6229. {
  6230. count++;
  6231. }
  6232. return count;
  6233. }
  6234. }
  6235. }