баг в LINQ Update
От: pr0ff  
Дата: 26.10.10 11:00
Оценка:
            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
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re: баг в LINQ Update
От: pr0ff  
Дата: 17.11.10 17:19
Оценка:
            DbManager db = new DbManager(new SqlConnection("Data Source=(local);Initial Catalog=shop;Integrated Security=True"));
            var names = new[] {"a", "b"};
            IQueryable<CoreTask> q = null;
            foreach (var name in names)
            {
                string g = name;
                var q1 =
                    db.GetTable<CoreTask>().Where(
                        a =>
                        a.ClassName == g && (a.LockID == null || a.LockTimeout < DateTime.Now) && a.RunAt < DateTime.Now);
                q = q == null ? q1 : q.Union(q1);
            }
            db.GetTable<CoreTask>().Update(a => q.Contains(a),
                                a => new CoreTask { LockID = Guid.NewGuid(), LockTimeout = DateTime.Now }); // good
            q.Update(a => new CoreTask { LockID = Guid.NewGuid(), LockTimeout = DateTime.Now });
            /*Table not found for 't8.t9.LockID'.
   в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildExpression(StringBuilder sb, ISqlExpression expr, Boolean buildTableName, Boolean checkParentheses, String alias, Boolean& addAlias)
   в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildExpression(StringBuilder sb, ISqlExpression expr, Boolean buildTableName, Boolean checkParentheses)
   в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildUpdateSet(StringBuilder sb)
   в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildUpdateClause(StringBuilder sb)
   в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildSql(StringBuilder sb)
   в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.AlternativeBuildSql(StringBuilder sb, Boolean implementOrderBy, Action`1 buildSql)
   в BLToolkit.Data.Sql.SqlProvider.MsSqlSqlProvider.BuildSql(StringBuilder sb)
   в BLToolkit.Data.Sql.SqlProvider.BasicSqlProvider.BuildSql(Int32 commandNumber, SqlQuery sqlQuery, StringBuilder sb, Int32 indent, Int32 nesting, Boolean skipAlias)
   в BLToolkit.Data.DbManager.GetCommand(IQueryContext query)
   в BLToolkit.Data.DbManager.BLToolkit.Data.Linq.IDataContext.SetQuery(IQueryContext queryContext)
   в BLToolkit.Data.Linq.ExpressionInfo`1.SetCommand(IDataContext dataContext, Expression expr, Object[] parameters, Int32 idx)
   в BLToolkit.Data.Linq.ExpressionInfo`1.NonQueryQuery(IDataContextInfo dataContextInfo, Expression expr, Object[] parameters)
   в BLToolkit.Data.Linq.ExpressionInfo`1.<SetNonQueryQuery>b__a(QueryContext ctx, IDataContextInfo db, Expression expr, Object[] ps)
   в BLToolkit.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
   в BLToolkit.Data.Linq.LinqExtensions.Update[T](IQueryable`1 source, Expression`1 setter)
   в ConsoleApplication7.Program.Main() в C:\Users\proff\documents\visual studio 2010\Projects\ConsoleApplication7\ConsoleApplication7\Program.cs:строка 28
   в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   в System.Threading.ThreadHelper.ThreadStart()*/
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[2]: баг в LINQ Update
От: IT Россия linq2db.com
Дата: 17.11.10 17:52
Оценка:
Здравствуйте, pr0ff, Вы писали:

Давно обновлялся?
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: баг в LINQ Update
От: pr0ff  
Дата: 17.11.10 18:28
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, pr0ff, Вы писали:


IT>Давно обновлялся?

сегодня, за 1-2 часа до написания сообщения (вообщем после правки недавней "злой баги")
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[4]: баг в LINQ Update
От: IT Россия linq2db.com
Дата: 17.11.10 19:29
Оценка:
Здравствуйте, pr0ff, Вы писали:

Что-то никак не повторяется. Можно минимальный запрос без циклов и лишних условий. Неплохо бы ещё CoreTask для полноты картины.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: баг в LINQ Update
От: pr0ff  
Дата: 17.11.10 20:06
Оценка:
Здравствуйте, IT, Вы писали:
IT>Что-то никак не повторяется. Можно минимальный запрос без циклов и лишних условий. Неплохо бы ещё CoreTask для полноты картины.
Ок, завтра попробую еще упростить
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[5]: баг в LINQ Update
От: pr0ff  
Дата: 18.11.10 14:06
Оценка:
Ревизия 1056
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
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[5]: баг в LINQ Update
От: pr0ff  
Дата: 23.11.10 12:47
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, pr0ff, Вы писали:


IT>Что-то никак не повторяется. Можно минимальный запрос без циклов и лишних условий. Неплохо бы ещё CoreTask для полноты картины.


получилось повторить?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[6]: баг в LINQ Update
От: IT Россия linq2db.com
Дата: 23.11.10 23:39
Оценка:
Здравствуйте, pr0ff, Вы писали:

P>получилось повторить?


Получилось. Теперь ломаю мозг как пофиксить.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.