foreach (string group in groupedResult)
{
TaskDescription description = GetDescription(group);
if (description.Error)
continue;
int take = description.PreloadCount;
if (take == 0)
take = description.Concurrent;
if (take == 0)
take = _pool.Concurrency;
string g = group;
take = take - _tasks.Where(a => a.ClassName == g).Count();
IQueryable<CoreTask> q1 =
db.CoreTasks.Where(a => a.ClassName == g && (a.LockID == null || a.LockTimeout < DateTime.Now) && a.RunAt < DateTime.Now).
OrderBy(a => a.RunAt).Take(take);
q = q == null ? q1 : q.Union(q);
}
if (q == null)
return;
db.CoreTasks.Update(a => q.Contains(a),
a => new CoreTask {LockID = _lockID, LockTimeout = DateTime.Now + _lockTimeout});
//q.Update(a => new CoreTask { LockID = _lockID, LockTimeout = DateTime.Now + _lockTimeout });
закоментированный вариант не пашет (ошибка в синтаксисе SQL), не закоментированный пашет. У меня сейчас полно дел, а SQL Profiler почему-то вылетает. Так что пока ничем больше не могу помочь. Используется MSSQL, в цикле была одна итерация, так что тестилось без Union
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, pr0ff, Вы писали:
IT>Давно обновлялся?
сегодня, за 1-2 часа до написания сообщения (вообщем после правки недавней "злой баги")
Здравствуйте, IT, Вы писали: IT>Что-то никак не повторяется. Можно минимальный запрос без циклов и лишних условий. Неплохо бы ещё CoreTask для полноты картины.
Ок, завтра попробую еще упростить
using System;
using System.Data.SqlClient;
using System.Linq;
using BLToolkit.Data;
using BLToolkit.Data.Linq;
using BLToolkit.DataAccess;
namespace ConsoleApplication7
{
internal class Program
{
private static void Main()
{
var db =
new DbManager(new SqlConnection("Data Source=(local);Initial Catalog=shop;Integrated Security=True"));
IQueryable<CoreTask> q = db.GetTable<CoreTask>().Union(db.GetTable<CoreTask>());
db.GetTable<CoreTask>().Update(a => q.Contains(a), a => new CoreTask {ID = a.ID}); // good
q.Update(a => new CoreTask {ID=a.ID}); //error
}
#region Nested type: CoreTask
[TableName(Owner = "Core", Name = "Tasks")]
public class CoreTask
{
[PrimaryKey]
public Guid ID { get; set; }
public Guid? LockID { get; set; }
}
#endregion
}
}
Если убрать Owner, то ошибки нет. Если убрать LockID, то
Необработанное исключение: System.InvalidOperationException: Операция является н
едопустимой из-за текущего состояния объекта.
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildExpression(StringBuild
er sb, ISqlExpression expr, Boolean buildTableName, Boolean checkParentheses, St
ring alias, Boolean& addAlias) в C:\sources\bl-toolkit\Source\Data\Sql\SqlProvid
er\BasicSqlProvider.cs:строка 1204
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildPredicate(StringBuilde
r sb, ISqlPredicate predicate) в C:\sources\bl-toolkit\Source\Data\Sql\SqlProvid
er\BasicSqlProvider.cs:строка 719
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildPredicate(StringBuilde
r sb, Int32 parentPrecedence, ISqlPredicate predicate) в C:\sources\bl-toolkit\S
ource\Data\Sql\SqlProvider\BasicSqlProvider.cs:строка 1022
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildSearchCondition(String
Builder sb, SearchCondition condition) в C:\sources\bl-toolkit\Source\Data\Sql\S
qlProvider\BasicSqlProvider.cs:строка 694
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildSearchCondition(String
Builder sb, Int32 parentPrecedence, SearchCondition condition) в C:\sources\bl-t
oolkit\Source\Data\Sql\SqlProvider\BasicSqlProvider.cs:строка 709
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildWhereSearchCondition(S
tringBuilder sb, SearchCondition condition) в C:\sources\bl-toolkit\Source\Data\
Sql\SqlProvider\BasicSqlProvider.cs:строка 666
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildWhereClause(StringBuil
der sb) в C:\sources\bl-toolkit\Source\Data\Sql\SqlProvider\BasicSqlProvider.cs:
строка 517
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildSql(StringBuilder sb)
в C:\sources\bl-toolkit\Source\Data\Sql\SqlProvider\BasicSqlProvider.cs:строка 1
53
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.AlternativeBuildSql(StringB
uilder sb, Boolean implementOrderBy, Action`1 buildSql) в C:\sources\bl-toolkit\
Source\Data\Sql\SqlProvider\BasicSqlProvider.cs:строка 1605
в BLToolkit.Data.Sql.SqlProvider.MsSqlSqlProvider.BuildSql(StringBuilder sb)
в C:\sources\bl-toolkit\Source\Data\Sql\SqlProvider\MsSqlSqlProvider.cs:строка 1
9
в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildSql(Int32 commandNumbe
r, SqlQuery sqlQuery, StringBuilder sb, Int32 indent, Int32 nesting, Boolean ski
pAlias) в C:\sources\bl-toolkit\Source\Data\Sql\SqlProvider\BasicSqlProvider.cs:
строка 90
в BLToolkit.Data.DbManager.GetCommand(IQueryContext query) в C:\sources\bl-to
olkit\Source\Data\DbManager.Linq.cs:строка 87
в BLToolkit.Data.DbManager.BLToolkit.Data.Linq.IDataContext.SetQuery(IQueryCo
ntext queryContext) в C:\sources\bl-toolkit\Source\Data\DbManager.Linq.cs:строка
43
в BLToolkit.Data.Linq.ExpressionInfo`1.SetCommand(IDataContext dataContext, E
xpression expr, Object[] parameters, Int32 idx) в C:\sources\bl-toolkit\Source\D
ata\Linq\ExpressionInfo.cs:строка 0
в BLToolkit.Data.Linq.ExpressionInfo`1.NonQueryQuery(IDataContextInfo dataCon
textInfo, Expression expr, Object[] parameters) в C:\sources\bl-toolkit\Source\D
ata\Linq\ExpressionInfo.cs:строка 144
в BLToolkit.Data.Linq.ExpressionInfo`1.<SetNonQueryQuery>b__a(QueryContext ct
x, IDataContextInfo db, Expression expr, Object[] ps) в C:\sources\bl-toolkit\So
urce\Data\Linq\ExpressionInfo.cs:строка 133
в BLToolkit.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Exp
ression expression) в C:\sources\bl-toolkit\Source\Data\Linq\TableT.cs:строка 17
9
в BLToolkit.Data.Linq.LinqExtensions.Update[T](IQueryable`1 source, Expressio
n`1 predicate, Expression`1 setter) в C:\sources\bl-toolkit\Source\Data\Linq\Lin
qExtensions.cs:строка 135
в ConsoleApplication7.Program.Main() в C:\Users\proff\Documents\Visual Studio
2010\Projects\ConsoleApplication7\ConsoleApplication7\Program.cs:строка 17
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, pr0ff, Вы писали:
IT>Что-то никак не повторяется. Можно минимальный запрос без циклов и лишних условий. Неплохо бы ещё CoreTask для полноты картины.