annotate Source/Data/Linq/LinqExtensions.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +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.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Linq.Expressions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using JetBrains.Annotations;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 namespace BLToolkit.Data.Linq
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public static class LinqExtensions
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 #region Table Helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 static public Table<T> TableName<T>([NotNull] this Table<T> table, [NotNull] string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 if (table == null) throw new ArgumentNullException("table");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 if (name == null) throw new ArgumentNullException("name");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 table.Expression = Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 new[] { table.Expression, Expression.Constant(name) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 return table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 static public Table<T> DatabaseName<T>([NotNull] this Table<T> table, [NotNull] string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 if (table == null) throw new ArgumentNullException("table");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 if (name == null) throw new ArgumentNullException("name");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 table.Expression = Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 new[] { table.Expression, Expression.Constant(name) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 return table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 static public Table<T> OwnerName<T>([NotNull] this Table<T> table, [NotNull] string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 if (table == null) throw new ArgumentNullException("table");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 if (name == null) throw new ArgumentNullException("name");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 table.Expression = Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 new[] { table.Expression, Expression.Constant(name) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 return table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 #region Scalar Select
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 static public T Select<T>([NotNull] this IDataContext dataContext, [NotNull, InstantHandle] Expression<Func<T>> selector)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 if (dataContext == null) throw new ArgumentNullException("dataContext");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 if (selector == null) throw new ArgumentNullException("selector");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 var q = new Table<T>(dataContext, selector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 foreach (var item in q)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 return item;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 #region Delete
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 public static int Delete<T>([NotNull] this IQueryable<T> source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 return source.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 new[] { source.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 public static int Delete<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 [NotNull, InstantHandle] this IQueryable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 [NotNull, InstantHandle] Expression<Func<T,bool>> predicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 if (predicate == null) throw new ArgumentNullException("predicate");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 return source.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 new[] { source.Expression, Expression.Quote(predicate) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 #region Update
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 public static int Update<TSource,TTarget>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 [NotNull] Table<TTarget> target,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 [NotNull, InstantHandle] Expression<Func<TSource,TTarget>> setter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 if (setter == null) throw new ArgumentNullException("setter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 return source.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 new[] { source.Expression, ((IQueryable<TTarget>)target).Expression, Expression.Quote(setter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 public static int Update<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 [NotNull] this IQueryable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 [NotNull, InstantHandle] Expression<Func<T,T>> setter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 if (setter == null) throw new ArgumentNullException("setter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 return source.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 new[] { source.Expression, Expression.Quote(setter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 public static int Update<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 [NotNull] this IQueryable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 [NotNull, InstantHandle] Expression<Func<T,bool>> predicate,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 [NotNull, InstantHandle] Expression<Func<T,T>> setter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 if (predicate == null) throw new ArgumentNullException("predicate");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 if (setter == null) throw new ArgumentNullException("setter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 return source.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 new[] { source.Expression, Expression.Quote(predicate), Expression.Quote(setter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 public static int Update<T>([NotNull] this IUpdatable<T> source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 var query = ((Updatable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 return query.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 new[] { query.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 class Updatable<T> : IUpdatable<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 public IQueryable<T> Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 public static IUpdatable<T> AsUpdatable<T>([NotNull] this IQueryable<T> source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 var query = source.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 new[] { source.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 return new Updatable<T> { Query = query };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 public static IUpdatable<T> Set<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 [NotNull] this IQueryable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 [NotNull, InstantHandle] Expression<Func<T,TV>> extract,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 [NotNull, InstantHandle] Expression<Func<T,TV>> update)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 if (extract == null) throw new ArgumentNullException("extract");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 if (update == null) throw new ArgumentNullException("update");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 var query = source.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 new[] { source.Expression, Expression.Quote(extract), Expression.Quote(update) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 return new Updatable<T> { Query = query };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 public static IUpdatable<T> Set<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 [NotNull] this IUpdatable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 [NotNull, InstantHandle] Expression<Func<T,TV>> extract,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 [NotNull, InstantHandle] Expression<Func<T,TV>> update)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 if (extract == null) throw new ArgumentNullException("extract");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 if (update == null) throw new ArgumentNullException("update");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 var query = ((Updatable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 query = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 new[] { query.Expression, Expression.Quote(extract), Expression.Quote(update) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 return new Updatable<T> { Query = query };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 public static IUpdatable<T> Set<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 [NotNull] this IQueryable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 [NotNull, InstantHandle] Expression<Func<T,TV>> extract,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 [NotNull, InstantHandle] Expression<Func<TV>> update)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 if (extract == null) throw new ArgumentNullException("extract");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 if (update == null) throw new ArgumentNullException("update");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 var query = source.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 new[] { source.Expression, Expression.Quote(extract), Expression.Quote(update) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 return new Updatable<T> { Query = query };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 public static IUpdatable<T> Set<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 [NotNull] this IUpdatable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 [NotNull, InstantHandle] Expression<Func<T,TV>> extract,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 [NotNull, InstantHandle] Expression<Func<TV>> update)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 if (extract == null) throw new ArgumentNullException("extract");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 if (update == null) throw new ArgumentNullException("update");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 var query = ((Updatable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 query = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 new[] { query.Expression, Expression.Quote(extract), Expression.Quote(update) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 return new Updatable<T> { Query = query };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 public static IUpdatable<T> Set<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 [NotNull] this IQueryable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 [NotNull, InstantHandle] Expression<Func<T,TV>> extract,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 TV value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 if (extract == null) throw new ArgumentNullException("extract");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 var query = source.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 new[] { source.Expression, Expression.Quote(extract), Expression.Constant(value, typeof(TV)) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 return new Updatable<T> { Query = query };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 public static IUpdatable<T> Set<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 [NotNull] this IUpdatable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 [NotNull, InstantHandle] Expression<Func<T,TV>> extract,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 TV value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 if (extract == null) throw new ArgumentNullException("extract");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 var query = ((Updatable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 query = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 new[] { query.Expression, Expression.Quote(extract), Expression.Constant(value, typeof(TV)) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 return new Updatable<T> { Query = query };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 #region Insert
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 public static int Insert<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 [NotNull] this Table<T> target,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 [NotNull, InstantHandle] Expression<Func<T>> setter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 if (setter == null) throw new ArgumentNullException("setter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 IQueryable<T> query = target;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 return query.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 new[] { query.Expression, Expression.Quote(setter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 public static object InsertWithIdentity<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 [NotNull] this Table<T> target,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 [NotNull, InstantHandle] Expression<Func<T>> setter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 if (setter == null) throw new ArgumentNullException("setter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 IQueryable<T> query = target;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 return query.Provider.Execute<object>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 new[] { query.Expression, Expression.Quote(setter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 #region ValueInsertable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 class ValueInsertable<T> : IValueInsertable<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 public IQueryable<T> Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 public static IValueInsertable<T> Into<T>(this IDataContext dataContext, [NotNull] Table<T> target)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 IQueryable<T> query = target;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 var q = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 new[] { Expression.Constant(null, typeof(IDataContext)), query.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 return new ValueInsertable<T> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 public static IValueInsertable<T> Value<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 [NotNull] this Table<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 [NotNull, InstantHandle] Expression<Func<T,TV>> field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 [NotNull, InstantHandle] Expression<Func<TV>> value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 if (value == null) throw new ArgumentNullException("value");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 var query = (IQueryable<T>)source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 var q = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 return new ValueInsertable<T> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 public static IValueInsertable<T> Value<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 [NotNull] this Table<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 [NotNull, InstantHandle] Expression<Func<T,TV>> field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 TV value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 var query = (IQueryable<T>)source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 var q = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 new[] { query.Expression, Expression.Quote(field), Expression.Constant(value, typeof(TV)) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 return new ValueInsertable<T> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 public static IValueInsertable<T> Value<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 [NotNull] this IValueInsertable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 [NotNull, InstantHandle] Expression<Func<T,TV>> field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 [NotNull, InstantHandle] Expression<Func<TV>> value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 if (value == null) throw new ArgumentNullException("value");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 var query = ((ValueInsertable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 var q = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 return new ValueInsertable<T> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 public static IValueInsertable<T> Value<T,TV>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 [NotNull] this IValueInsertable<T> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 [NotNull, InstantHandle] Expression<Func<T,TV>> field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 TV value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 var query = ((ValueInsertable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 var q = query.Provider.CreateQuery<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 new[] { query.Expression, Expression.Quote(field), Expression.Constant(value, typeof(TV)) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 return new ValueInsertable<T> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 public static int Insert<T>([NotNull] this IValueInsertable<T> source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 var query = ((ValueInsertable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 return query.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 new[] { query.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 public static object InsertWithIdentity<T>([NotNull] this IValueInsertable<T> source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 var query = ((ValueInsertable<T>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 return query.Provider.Execute<object>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 new[] { query.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 #region SelectInsertable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 public static int Insert<TSource,TTarget>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 [NotNull] Table<TTarget> target,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 [NotNull, InstantHandle] Expression<Func<TSource, TTarget>> setter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 if (setter == null) throw new ArgumentNullException("setter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 return source.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 new[] { source.Expression, ((IQueryable<TTarget>)target).Expression, Expression.Quote(setter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 public static object InsertWithIdentity<TSource,TTarget>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 [NotNull] Table<TTarget> target,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 [NotNull, InstantHandle] Expression<Func<TSource,TTarget>> setter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 if (setter == null) throw new ArgumentNullException("setter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 return source.Provider.Execute<object>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487 new[] { source.Expression, ((IQueryable<TTarget>)target).Expression, Expression.Quote(setter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 class SelectInsertable<T,TT> : ISelectInsertable<T,TT>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 public IQueryable<T> Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 public static ISelectInsertable<TSource,TTarget> Into<TSource,TTarget>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 [NotNull] Table<TTarget> target)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 var q = source.Provider.CreateQuery<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 new[] { source.Expression, ((IQueryable<TTarget>)target).Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 return new SelectInsertable<TSource,TTarget> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 public static ISelectInsertable<TSource,TTarget> Value<TSource,TTarget,TValue>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 [NotNull] this ISelectInsertable<TSource,TTarget> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 [NotNull, InstantHandle] Expression<Func<TTarget,TValue>> field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 [NotNull, InstantHandle] Expression<Func<TSource,TValue>> value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 if (value == null) throw new ArgumentNullException("value");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 var query = ((SelectInsertable<TSource,TTarget>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 var q = query.Provider.CreateQuery<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget), typeof(TValue) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 return new SelectInsertable<TSource,TTarget> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 public static ISelectInsertable<TSource,TTarget> Value<TSource,TTarget,TValue>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 [NotNull] this ISelectInsertable<TSource,TTarget> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 [NotNull, InstantHandle] Expression<Func<TTarget,TValue>> field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 [NotNull, InstantHandle] Expression<Func<TValue>> value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 if (value == null) throw new ArgumentNullException("value");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 var query = ((SelectInsertable<TSource,TTarget>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 var q = query.Provider.CreateQuery<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget), typeof(TValue) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 return new SelectInsertable<TSource,TTarget> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 public static ISelectInsertable<TSource,TTarget> Value<TSource,TTarget,TValue>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 [NotNull] this ISelectInsertable<TSource,TTarget> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 [NotNull, InstantHandle] Expression<Func<TTarget,TValue>> field,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 TValue value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 var query = ((SelectInsertable<TSource,TTarget>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 var q = query.Provider.CreateQuery<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget), typeof(TValue) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 new[] { query.Expression, Expression.Quote(field), Expression.Constant(value, typeof(TValue)) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 return new SelectInsertable<TSource,TTarget> { Query = q };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 public static int Insert<TSource,TTarget>([NotNull] this ISelectInsertable<TSource,TTarget> source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 var query = ((SelectInsertable<TSource,TTarget>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 return query.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 new[] { query.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 public static object InsertWithIdentity<TSource,TTarget>([NotNull] this ISelectInsertable<TSource,TTarget> source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 var query = ((SelectInsertable<TSource,TTarget>)source).Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 return query.Provider.Execute<object>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592 new[] { query.Expression }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599 #region InsertOrUpdate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 public static int InsertOrUpdate<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 [NotNull] this Table<T> target,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 [NotNull, InstantHandle] Expression<Func<T>> insertSetter,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604 [NotNull, InstantHandle] Expression<Func<T,T>> onDuplicateKeyUpdateSetter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 if (insertSetter == null) throw new ArgumentNullException("insertSetter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 if (onDuplicateKeyUpdateSetter == null) throw new ArgumentNullException("onDuplicateKeyUpdateSetter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610 IQueryable<T> query = target;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 return query.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 new[] { query.Expression, Expression.Quote(insertSetter), Expression.Quote(onDuplicateKeyUpdateSetter) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 public static int InsertOrUpdate<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620 [NotNull] this Table<T> target,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 [NotNull, InstantHandle] Expression<Func<T>> insertSetter,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 [NotNull, InstantHandle] Expression<Func<T,T>> onDuplicateKeyUpdateSetter,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 [NotNull, InstantHandle] Expression<Func<T>> keySelector)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 if (target == null) throw new ArgumentNullException("target");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 if (insertSetter == null) throw new ArgumentNullException("insertSetter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 if (onDuplicateKeyUpdateSetter == null) throw new ArgumentNullException("onDuplicateKeyUpdateSetter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 if (keySelector == null) throw new ArgumentNullException("keySelector");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 IQueryable<T> query = target;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 return query.Provider.Execute<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 new[]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 query.Expression,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639 Expression.Quote(insertSetter),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 Expression.Quote(onDuplicateKeyUpdateSetter),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641 Expression.Quote(keySelector)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 #region Take / Skip / ElementAt
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 public static IQueryable<TSource> Take<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 [NotNull, InstantHandle] Expression<Func<int>> count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 if (count == null) throw new ArgumentNullException("count");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656 return source.Provider.CreateQuery<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 new[] { source.Expression, Expression.Quote(count) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 public static IQueryable<TSource> Skip<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 [NotNull, InstantHandle] Expression<Func<int>> count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668 if (count == null) throw new ArgumentNullException("count");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 return source.Provider.CreateQuery<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 new[] { source.Expression, Expression.Quote(count) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677 public static TSource ElementAt<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679 [NotNull, InstantHandle] Expression<Func<int>> index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 if (index == null) throw new ArgumentNullException("index");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 return source.Provider.Execute<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688 new[] { source.Expression, Expression.Quote(index) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691 public static TSource ElementAtOrDefault<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692 [NotNull] this IQueryable<TSource> source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693 [NotNull, InstantHandle] Expression<Func<int>> index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696 if (index == null) throw new ArgumentNullException("index");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698 return source.Provider.Execute<TSource>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701 ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702 new[] { source.Expression, Expression.Quote(index) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707 #region Stub helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 static TOutput Where<TOutput,TSource,TInput>(this TInput source, Func<TSource,bool> predicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716 }