-
Notifications
You must be signed in to change notification settings - Fork 82
/
LinqDeepGraph.cs
129 lines (119 loc) · 6.4 KB
/
LinqDeepGraph.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System;
using System.Linq;
using Xunit;
using Norm.Configuration;
using Norm.Tests.Helpers;
namespace Norm.Tests
{
public class LinqDeepGraph
{
public LinqDeepGraph()
{
MongoConfiguration.RemoveMapFor<TestProduct>();
MongoConfiguration.RemoveMapFor<Supplier>();
MongoConfiguration.RemoveMapFor<InventoryChange>();
MongoConfiguration.RemoveMapFor<Address>();
using (var session = new Session())
{
session.Drop<TestProduct>();
}
}
[Fact]
public void OneProductShouldBeReturnedWhenNestedSupplierQueried()
{
using (var session = new Session())
{
session.Add(new TestProduct { Name = "Test3", Price = 10, Supplier = new Supplier { Name = "Steve" } });
session.Add(new TestProduct { Name = "Test4", Price = 22 });
session.Add(new TestProduct { Name = "Test5", Price = 33 });
var queryable = session.Products;
var products = queryable.Where(x => x.Supplier.Name == "Steve").ToList();
Assert.Equal(1, products.Count);
Assert.Equal(false, queryable.QueryStructure().IsComplex);
}
}
[Fact]
public void SupplierShouldBeQuerybleByDateMath()
{
using (var session = new Session())
{
var add = new Address { State = "HI", Street = "100 Main" };
session.Add(new TestProduct { Name = "Test3", Price = 10, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2000, 2, 1), Address = add } });
session.Add(new TestProduct { Name = "Test4", Price = 22, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2001, 2, 1) } });
session.Add(new TestProduct { Name = "Test5", Price = 33, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2002, 2, 1) } });
var queryable = session.Products;
var products = queryable.Where(x => x.Supplier.CreatedOn.Year < 2001).ToList();
Assert.Equal(1, products.Count);
Assert.Equal(true, queryable.QueryStructure().IsComplex);
}
}
[Fact]
public void SupplierShouldBeQuerybleByAddress()
{
using (var session = new Session())
{
var add = new Address { State = "HI", Street = "100 Main" };
session.Add(new TestProduct { Name = "Test3", Price = 10, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2000, 2, 1), Address = add } });
session.Add(new TestProduct { Name = "Test4", Price = 22, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2001, 2, 1) } });
session.Add(new TestProduct { Name = "Test5", Price = 33, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2002, 2, 1) } });
var queryable = session.Products;
var products = queryable.Where(x => x.Supplier.Address.State == "HI").ToList();
Assert.Equal(1, products.Count);
Assert.Equal(false, queryable.QueryStructure().IsComplex);
}
}
[Fact]
public void SupplierShouldBeQuerybleByAddressAndWorkWithAndExpression()
{
using (var session = new Session())
{
var add = new Address { State = "HI", Street = "100 Main" };
session.Add(new TestProduct { Name = "Test3", Price = 10, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2000, 2, 1), Address = add } });
session.Add(new TestProduct { Name = "Test4", Price = 22, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2001, 2, 1) } });
session.Add(new TestProduct { Name = "Test5", Price = 33, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2002, 2, 1) } });
var queryable = session.Products;
var products = queryable.Where(x => x.Supplier.Address.State == "HI" && x.Price == 10).ToList();
Assert.Equal(1, products.Count);
Assert.Equal(false, queryable.QueryStructure().IsComplex);
}
}
[Fact]
public void SupplierShouldBeQuerybleByAddressAndWorkWithOrExpression()
{
using (var session = new Session())
{
var add = new Address { State = "HI", Street = "100 Main" };
session.Add(new TestProduct { Name = "Test3", Price = 10, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2000, 2, 1), Address = add } });
session.Add(new TestProduct { Name = "Test4", Price = 22, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2001, 2, 1) } });
session.Add(new TestProduct { Name = "Test5", Price = 33, Supplier = new Supplier { Name = "Steve", CreatedOn = new DateTime(2002, 2, 1) } });
var queryable = session.Products;
var products = queryable.Where(x => x.Supplier.Address.State == "HI" || x.Price == 33).ToList();
Assert.Equal(2, products.Count);
Assert.Equal(true, queryable.QueryStructure().IsComplex);
}
}
[Fact]
public void InventorySubqueryShouldReturnOneForTwoProducts()
{
using (var session = new Session())
{
//create a Product
var p = new TestProduct() { Name = "Test1", Price = 10 };
//change the inventory
p.Inventory.Add(new InventoryChange() { AmountChanged = 1 });
session.Add(p);
p = new TestProduct() { Name = "Test3", Price = 10 };
//change the inventory
p.Inventory.Add(new InventoryChange() { AmountChanged = 1 });
p.Inventory.Add(new InventoryChange() { AmountChanged = 2 });
p.Inventory.Add(new InventoryChange() { AmountChanged = -1 });
session.Add(p);
var queryable = session.Products;
var products = queryable.Where(x => x.Inventory.Count() > 2).ToArray();
Assert.Equal(1, products.Count());
Assert.Equal("Test3", products[0].Name);
Assert.Equal(true, queryable.QueryStructure().IsComplex);
}
}
}
}