annotate UnitTests/Linq/Model/NorthwindDB.cs @ 1:8f65451dc28f

Исправлена проблема с фабрикой и выборкой нескольких объектов в linq выражении
author cin
date Fri, 28 Mar 2014 01:04:56 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Linq.Expressions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Data.DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Data.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using BLToolkit.Data.Sql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using BLToolkit.Data.Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 namespace Data.Linq.Model
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 public class NorthwindDB : DbManager
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public NorthwindDB() : base("Northwind")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public Table<Northwind.Category> Category { get { return GetTable<Northwind.Category>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 public Table<Northwind.Customer> Customer { get { return GetTable<Northwind.Customer>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public Table<Northwind.Employee> Employee { get { return GetTable<Northwind.Employee>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 public Table<Northwind.EmployeeTerritory> EmployeeTerritory { get { return GetTable<Northwind.EmployeeTerritory>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public Table<Northwind.OrderDetail> OrderDetail { get { return GetTable<Northwind.OrderDetail>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 public Table<Northwind.Order> Order { get { return GetTable<Northwind.Order>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 public Table<Northwind.Product> Product { get { return GetTable<Northwind.Product>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public Table<Northwind.ActiveProduct> ActiveProduct { get { return GetTable<Northwind.ActiveProduct>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 public Table<Northwind.DiscontinuedProduct> DiscontinuedProduct { get { return GetTable<Northwind.DiscontinuedProduct>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 public Table<Northwind.Region> Region { get { return GetTable<Northwind.Region>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 public Table<Northwind.Shipper> Shipper { get { return GetTable<Northwind.Shipper>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 public Table<Northwind.Supplier> Supplier { get { return GetTable<Northwind.Supplier>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 public Table<Northwind.Territory> Territory { get { return GetTable<Northwind.Territory>(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 #if !MONO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 public class FreeTextKey<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 public T Key;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 public int Rank;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 class FreeTextTableExpressionAttribute : TableExpressionAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 public FreeTextTableExpressionAttribute()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 : base("")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 var aargs = sqlArgs.ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 var arr = ConvertArgs(member, aargs).ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 var method = (MethodInfo)member;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 var sp = new MsSql2008SqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 var ttype = method.GetGenericArguments()[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 var tbl = new SqlTable(ttype);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 var database = tbl.Database == null ? null : sp.Convert(tbl.Database, ConvertType.NameToDatabase). ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 var owner = tbl.Owner == null ? null : sp.Convert(tbl.Owner, ConvertType.NameToOwner). ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 var name = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 var field = ((ConstantExpression)expArgs.First()).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 if (field is string)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 else if (field is LambdaExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 var body = ((LambdaExpression)field).Body;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 if (body is MemberExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 var name = ((MemberExpression)body).Member.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 arr[0] = new SqlExpression(name, Precedence.Primary);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 table.SqlTableType = SqlTableType.Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 table.Name = "FREETEXTTABLE({6}, {2}, {3}) {1}";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 table.TableArguments = arr.ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 [FreeTextTableExpressionAttribute]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 return GetTable<FreeTextKey<TKey>>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 ((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 text);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 [FreeTextTableExpressionAttribute]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 return GetTable<FreeTextKey<TKey>>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 ((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 fieldSelector,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 text);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 }