Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 02.01.10 19:34
Оценка: 29 (1)
Есть запрос (на самом деле это редуцированный вариант для воспроизведения проблемы)
var forums =
    srvFrms
        .Where(f => subsFrms.Any(of => of.ID == f.ID))
        .Select(f => new {f.Name, f.Descript, Priority = 0, IsSubscribed = false});

BLT на него ругается (на Any)
Собственно вопрос — что подправить, чтобы заработало?
Стектрейс:
System.ArgumentException: Queryable method call expected. Got 'value(Rsdn.Janus.SubscribeForm+<>c__DisplayClass2).subsFrms.Any(of => (of.ID = f.ID))'.
Имя параметра: info
в BLToolkit.Data.Linq.ExpressionParser`1.<ParseSequence>b__47(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSubQuery(ParseInfo expr, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseExpression(ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParsePredicate(LambdaInfo lambda, ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSearchCondition(ICollection`1 conditions, LambdaInfo lambda, ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseWhere(LambdaInfo l, QuerySource select)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass49.<>c__DisplayClass4d.<ParseSequence>b__1e(ParseInfo`1 seq, LambdaInfo l)
в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__2(LambdaInfo p)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass1c.<CheckIfLambda>b__19(ParseInfo`1 body)
в BLToolkit.Data.Linq.ParseInfo.IsLambda(Func`2[] parameters, Func`2 body, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.CheckIfLambda(Int32 nparms, Func`2 lambda)
в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__1(ParseInfo`1 l)
в BLToolkit.Data.Linq.ParseInfoExtension.IsMethod(ParseInfo`1 pi, Type declaringType, String methodName, Func`2[] args, Func`2 func)
в BLToolkit.Data.Linq.ParseInfoExtension.IsQueryableMethod(ParseInfo`1 pi, Func`3 lambda)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass49.<ParseSequence>b__1d(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass49.<>c__DisplayClass4d.<ParseSequence>b__1e(ParseInfo`1 seq, LambdaInfo l)
в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__2(LambdaInfo p)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass1c.<CheckIfLambda>b__19(ParseInfo`1 body)
в BLToolkit.Data.Linq.ParseInfo.IsLambda(Func`2[] parameters, Func`2 body, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.CheckIfLambda(Int32 nparms, Func`2 lambda)
в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__1(ParseInfo`1 l)
в BLToolkit.Data.Linq.ParseInfoExtension.IsMethod(ParseInfo`1 pi, Type declaringType, String methodName, Func`2[] args, Func`2 func)
в BLToolkit.Data.Linq.ParseInfoExtension.IsQueryableMethod(ParseInfo`1 pi, Func`3 lambda)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass49.<ParseSequence>b__1d(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass49.<ParseSequence>b__3b(ParseInfo`1 seq)
в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass2c.<IsQueryableMethod>b__29(ParseInfo`1 p)
в BLToolkit.Data.Linq.ParseInfoExtension.IsMethod(ParseInfo`1 pi, Type declaringType, String methodName, Func`2[] args, Func`2 func)
в BLToolkit.Data.Linq.ParseInfoExtension.IsQueryableMethod(ParseInfo`1 pi, String methodName, Action`1 seq, Func`2 action)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass49.<ParseSequence>b__3a(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
в BLToolkit.Data.Linq.ExpressionInfo`1.GetExpressionInfo(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expr)
в BLToolkit.Data.Linq.Table`1.GetExpressionInfo(Expression expression, Boolean cache)
в BLToolkit.Data.Linq.Table`1.get_SqlText()
в BLToolkit.Data.Linq.Query`1.get_SqlText()
... << RSDN@Home 1.2.0 alpha 4 rev. 1331 on Windows 7 6.1.7600.0>>
AVK Blog
Re: Запрос не работает
От: IT Россия linq2db.com
Дата: 03.01.10 06:26
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Есть запрос (на самом деле это редуцированный вариант для воспроизведения проблемы)


Any и All стоят первыми в списке фич к реализации и практически завершают его основную часть.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 03.01.10 09:52
Оценка:
Здравствуйте, IT, Вы писали:

IT>Any и All стоят первыми в списке фич к реализации и практически завершают его основную часть.


Ну так а сейчас то как быть? Заменить на Count() == 0 ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1331 on Windows 7 6.1.7600.0>>
AVK Blog
Re: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.01.10 15:10
Оценка:
В приведенном мной случае свежедобавленный Any работает. Но нашел вариант, когда парсер BLT вылетает:
var id = ForumMessageCommandHelper.GetMessageId(context, messageId);
using (var mgr = context.CreateDBManager())
    return mgr.Moderatorials().Any(m => m.MessageId == id);

Стектрейс:
System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
   в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
   в System.ThrowHelper.ThrowArgumentOutOfRangeException()
   в System.Collections.Generic.List`1.get_Item(Int32 index)
   в BLToolkit.Data.Linq.ExpressionParser`1.ParseAny(ParseInfo expr, LambdaInfo lambda)
   в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass4c.<>c__DisplayClass50.<ParseSequenceInternal>b__1e(ParseInfo`1 seq, LambdaInfo l)
   в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__2(LambdaInfo p)
   в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass1c.<CheckIfLambda>b__19(ParseInfo`1 body)
   в BLToolkit.Data.Linq.ParseInfo.IsLambda[T](Func`2[] parameters, Func`2 body, Func`2 func)
   в BLToolkit.Data.Linq.ParseInfo.CheckIfLambda(Int32 nparms, Func`2 lambda)
   в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__1(ParseInfo`1 l)
   в BLToolkit.Data.Linq.ParseInfoExtension.IsMethod(ParseInfo`1 pi, Type declaringType, String methodName, Func`2[] args, Func`2 func)
   в BLToolkit.Data.Linq.ParseInfoExtension.IsQueryableMethod(ParseInfo`1 pi, Func`3 lambda)
   в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass4c.<ParseSequenceInternal>b__1d(ParseInfo`1 pi)
   в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
   в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequenceInternal(ParseInfo info)
   в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
   в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
   в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
   в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
   в BLToolkit.Data.Linq.ExpressionInfo`1.GetExpressionInfo(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expr)
   в BLToolkit.Data.Linq.Table`1.GetExpressionInfo(Expression expression, Boolean cache)
   в BLToolkit.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
   в System.Linq.Queryable.Any[TSource](IQueryable`1 source, Expression`1 predicate)
   в Rsdn.Janus.ForumMessageCommandTarget.<>c__DisplayClass1.<QueryModeratingStatus>b__0() в C:\Work\Janus.TrunkNew\Janus\Features\ForumViewer\Commands\ForumMessage\ForumMessageCommandTarget.cs:строка 113
...


P.S. All(cond) вроде бы реализуется как Any(!cond)
... << RSDN@Home 1.2.0 alpha 4 rev. 1333 on Windows 7 6.1.7600.0>>
AVK Blog
Re: Запрос не работает
От: IT Россия linq2db.com
Дата: 04.01.10 16:14
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Есть запрос (на самом деле это редуцированный вариант для воспроизведения проблемы)


Как теперь?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.01.10 16:29
Оценка:
Здравствуйте, IT, Вы писали:

AVK>>Есть запрос (на самом деле это редуцированный вариант для воспроизведения проблемы)


IT>Как теперь?


В смысле теперь? Ты еще пока ничего не закоммитил
... << RSDN@Home 1.2.0 alpha 4 rev. 1333 on Windows 7 6.1.7600.0>>
AVK Blog
Re: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.01.10 16:52
Оценка: 58 (1)
Еще один неработающий запрос.
mgr
    .SubscribedForums()
    //.Select(f => new { f.ID, f.Name, f.Descript })
    //.ToArray()
    .Select(
        f =>
            new ListViewItem(new[] {"", f.Name, f.Descript})
            {
                Checked = true,
                ImageIndex = 0,
                Tag = f.ID
            })
    .ToArray()


Если убрать комментарии, то работает.

Стектрейс:
System.InvalidOperationException: Не удается использовать выражение типа "System.String" для инициализации массива типа "System.String[]"
   в System.Linq.Expressions.Expression.NewArrayInit(Type type, IEnumerable`1 initializers)
   в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
   в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass25`1.<Walk>b__24(T e, Int32 i)
   в BLToolkit.Data.Linq.ParseInfo.Walk[T](IEnumerable`1 source, Func`3 func)
   в BLToolkit.Data.Linq.ParseInfo.Walk[T](IEnumerable`1 source, MethodInfo property, Func`2 func)
   в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
   в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
   в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
   в BLToolkit.Data.Linq.ExpressionParser`1.BuildNewExpression(QuerySource query, ParseInfo expr, Func`2 converter)
   в BLToolkit.Data.Linq.ExpressionParser`1.BuildNew(QuerySource query, ParseInfo expr, Action`1 newAction)
   в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass70.<BuildSelect>b__6c(Expr expr)
   в BLToolkit.Data.Linq.QuerySource.Match(Action`1 tableAction, Action`1 exprAction, Action`1 subQueryAction, Action`1 scalarAction, Action`1 groupByAction)
   в BLToolkit.Data.Linq.ExpressionParser`1.BuildSelect(QuerySource query, Action`2 queryAction, Action`1 newAction, Func`2 converter)
   в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
   в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
   в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
   в BLToolkit.Data.Linq.ExpressionInfo`1.GetExpressionInfo(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expr)
   в BLToolkit.Data.Linq.Table`1.GetExpressionInfo(Expression expression, Boolean cache)
   в BLToolkit.Data.Linq.Table`1.Execute(DbManager db, Expression expression)
   в BLToolkit.Data.Linq.Table`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   в System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   в System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   в Rsdn.Janus.MarkMsgReadForm.CustomInitializeComponent() в C:\Work\Janus.TrunkNew\Janus\Features\ForumViewer\MarkMsgReadForm.cs:строка 270
...
... << RSDN@Home 1.2.0 alpha 4 rev. 1333 on Windows 7 6.1.7600.0>>
AVK Blog
Re[2]: Запрос не работает
От: IT Россия linq2db.com
Дата: 04.01.10 18:32
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>P.S. All(cond) вроде бы реализуется как Any(!cond)


Скорее как !Any(!cond)
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Запрос не работает
От: IT Россия linq2db.com
Дата: 04.01.10 22:20
Оценка: 27 (1)
Здравствуйте, AndrewVK, Вы писали:

AVK>Еще один неработающий запрос.


Fixed.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.10 16:44
Оценка: 29 (1)
Еще несколько неработающих сценариев.
var affectedTids =
    msgs
        .Where(m => portion.Contains(m.ID))
        .Select(m => m.TopicID == 0 ? m.ID : m.TopicID)
        .Distinct();


portion — объявлен как IEnumerable<int>, фактически int[]

генерит такой запрос
-- SQLite.default SQLite
SELECT DISTINCT
    [m].[tid] as [TopicID],
    [m].[mid] as [ID]
FROM
    [messages] [m]
WHERE
    [m].[mid] IN (System.Int32[])


При выполнении БД ругается на синтаксис "SQLite error\r\nnear \"[]\": syntax error"

Далее.
var q2 =
    affectedTids
        .Select(
            tid =>
                new 
                {
                    tid,
                    Count = msgs.Where(m => !m.IsRead && m.TopicID == tid).Count(),
                    Count2 = msgs.Where(m => !m.IsRead && m.TopicID == tid).Count()
                });


Не может даже сгенерить запрос. Если закомментировать одно из свойств Count, запрос генерится.

Стектрейс:
System.NullReferenceException: В экземпляре объекта не задана ссылка на объект.
в BLToolkit.Data.Linq.ParseInfo.op_Equality(ParseInfo pi, Expression expr)
в BLToolkit.Data.Linq.QuerySource.Expr.GetField(Expression expr)
в BLToolkit.Data.Linq.ExpressionParser`1.GetSource(LambdaInfo lambda, Expression expr, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.IsSubQuerySource(Expression expr, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.IsSubQuery(ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.IsSubQuery(ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass8b.<BuildNewExpression>b__89(ParseInfo pi)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass25`1.<Walk>b__24(T e, Int32 i)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNewExpression(QuerySource query, ParseInfo expr, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNew(QuerySource query, ParseInfo expr, Action`1 newAction)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass73.<BuildSelect>b__6f(Expr expr)
в BLToolkit.Data.Linq.QuerySource.Match(Action`1 tableAction, Action`1 exprAction, Action`1 subQueryAction, Action`1 scalarAction, Action`1 groupByAction)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildSelect(QuerySource query, Action`2 queryAction, Action`1 newAction, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
в BLToolkit.Data.Linq.ExpressionInfo`1.GetExpressionInfo(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expr)
в BLToolkit.Data.Linq.Table`1.GetExpressionInfo(Expression expression, Boolean cache)
в BLToolkit.Data.Linq.Table`1.get_SqlText()
в BLToolkit.Data.Linq.Query`1.get_SqlText()


Далее.
Запрос
var affectedIds =
    new HashSet<int>(
        db
            .Messages(m => m.ID < maxId + 1 && !m.IsRead)
            .Select(m => m.ID)
            //.ToList()
            .Concat(unreadIds));


unreadIds — IEnumerable<int>.

Если раскомментировать ToList — работает.

Стектрейс
System.ArgumentException was unhandled
  Message="Queryable method call expected. Got 'value(System.Collections.Generic.List`1[System.Int32])'.\r\nИмя параметра: info"
  Source="BLToolkit.3"
  ParamName="info"
  StackTrace:
       в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequenceInternal(ParseInfo info)
       в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
       в BLToolkit.Data.Linq.ExpressionParser`1.ParseUnion(QuerySource select, ParseInfo ex, Boolean all)
       в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass4f.<ParseSequenceInternal>b__3f(ParseInfo`1 ex)
       в BLToolkit.Data.Linq.ParseInfoExtension.IsMethod(ParseInfo`1 pi, Type declaringType, String methodName, Func`2[] args, Func`2 func)
       в BLToolkit.Data.Linq.ParseInfoExtension.IsQueryableMethod(ParseInfo`1 pi, String methodName, Action`1 seq, Func`2 action)
       в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass4f.<ParseSequenceInternal>b__3d(ParseInfo`1 pi)
       в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
       в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequenceInternal(ParseInfo info)
       в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
       в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
       в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
       в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
       в BLToolkit.Data.Linq.ExpressionInfo`1.GetExpressionInfo(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expr)
       в BLToolkit.Data.Linq.Table`1.GetExpressionInfo(Expression expression, Boolean cache)
       в BLToolkit.Data.Linq.Table`1.Execute(DbManager db, Expression expression)
       в BLToolkit.Data.Linq.Table`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
       в System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other)
       в System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection, IEqualityComparer`1 comparer)
       в System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection)
       в Rsdn.Janus.DatabaseManager.MarkMessagesRead(Int32 maxId, IEnumerable`1 unreadIds) в C:\Work\Janus.TrunkNew\Janus\Core\DataManagement\DatabaseManager\DatabaseManager.ReadMarks.cs:строка 268
...
... << RSDN@Home 1.2.0 alpha 4 rev. 1335 on Windows 7 6.1.7600.0>>
AVK Blog
Re[2]: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.10 20:57
Оценка: 4 (1)
Если кто наткнется, по следующему сценарию
var affectedIds =
    new HashSet<int>(
        db
            .Messages(m => m.ID < maxId + 1 && !m.IsRead)
            .Select(m => m.ID)
            .Concat(unreadIds));


Правильный вариант такой:
var affectedIds =
    new HashSet<int>(
        db
            .Messages(m => m.ID < maxId + 1 && !m.IsRead)
            .Select(m => m.ID)
            .AsEnumerable()
            .Concat(unreadIds));


IT обещал прикрутить нормальную диагностику.
... << RSDN@Home 1.2.0 alpha 4 rev. 1335 on Windows 7 6.1.7600.0>>
AVK Blog
Re[2]: Запрос не работает
От: IT Россия linq2db.com
Дата: 06.01.10 05:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>portion — объявлен как IEnumerable<int>, фактически int[]


Это пофиксил.

Остальное не успел. Неожиданно нарвался на другую проблему.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.10 10:49
Оценка:
Здравствуйте, IT, Вы писали:

AVK>>portion — объявлен как IEnumerable<int>, фактически int[]


IT>Это пофиксил.


Не до конца. Сейчас такой запрос генерится
-- SQLite.default SQLite
SELECT DISTINCT
    CASE
        WHEN [m].[tid] = 0 THEN [m].[mid]
        ELSE [m].[tid]
    END as [c1],
    [m].[tid] as [TopicID],
    [m].[mid] as [ID]
FROM
    [messages] [m]
WHERE
    [m].[mid] IN (59, 61, 63, 64, 65, 66, 67, 68, 69, 70)

Выделенное — лишнее, и ведет к тому, что в результате есть повторяющиеся элементы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1335 on Windows 7 6.1.7600.0>>
AVK Blog
Re: Запрос не работает
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.01.10 23:11
Оценка:
Очередная порция.
Код:
var q = db.Messages(m => m.TopicID == ID).OrderBy(m => m.Date);
q =
    Config.Instance.ForumDisplayConfig.NewMessagesOnTop
        ? q.OrderBy(m => m.ParentID)
        : q.OrderByDescending(m => m.ParentID);
var rates = db.Rates();
var msgs =
    q
        .Select(
            m =>
                new MsgImpl
                {
                    _parent = this,
                    IsChild = true,

                    IDImpl = m.ID,
                    ParentID = m.ParentID,
                    ForumID = m.ForumID,
                    NameImpl = m.Name,
                    DateImpl = m.Date,
                    SubjectImpl = m.Subject,
                    UserIDImpl = m.UserID,
                    UserClass = (short)m.UserClass,
                    UserNick = m.UserNick,
                    IsRead = m.IsRead,
                    IsMarked = m.IsMarked,
                    ClosedImpl = m.Closed,
                    ReadReplies = m.ReadReplies,
                    LastModeratedImpl = m.LastModerated,
                    ArticleId = m.ArticleId.GetValueOrDefault(),
                    //RatingImpl
                        //rates
                        //  .Where(r => r.MessageID == m.ID && (int)r.RateType > 0)
                        //  .Sum(r => (int)r.RateType * r.Multiplier),
                    //SmilesImpl
                        //rates
                        //  .Count(r => r.MessageID == m.ID && r.RateType == MessageRates.Smile),
                    //AgreesImpl
                        //rates
                        //  .Count(r => r.MessageID == m.ID && r.RateType == MessageRates.Agree),
                    //DisagreesImpl
                        //rates
                        //  .Count(r => r.MessageID == m.ID && r.RateType == MessageRates.DisAgree),
                    //ModeratorialsImpl
                        //db
                        //  .Moderatorials()
                        //  .Count(mod => mod.MessageID == m.ID && (m.LastModerated != null || mod.Create > m.LastModerated)),
                });


Теперь проблемы.

1) Первый OrderBy куда то теряется. В результирующем запросе только ORDER BY ParentID.

2) При раскомментировании подзапросов в Smiles, Agrees, Disagrees вылетает:
BLToolkit.Data.Linq.LinqException: 'm.ID' cannot be converted to SQL.
в BLToolkit.Data.Linq.ExpressionParser`1.ParseExpression(ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseCompare(LambdaInfo lambda, ExpressionType nodeType, ParseInfo left, ParseInfo right, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParsePredicate(LambdaInfo lambda, ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSearchCondition(ICollection`1 conditions, LambdaInfo lambda, ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSearchCondition(ICollection`1 conditions, LambdaInfo lambda, ParseInfo parseInfo, QuerySource[] queries)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseWhere(LambdaInfo l, QuerySource select)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass4e.<>c__DisplayClass52.<ParseSequenceInternal>b__1d(ParseInfo`1 seq, LambdaInfo l)
в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__2(LambdaInfo p)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass1c.<CheckIfLambda>b__19(ParseInfo`1 body)
в BLToolkit.Data.Linq.ParseInfo.IsLambda(Func`2[] parameters, Func`2 body, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.CheckIfLambda(Int32 nparms, Func`2 lambda)
в BLToolkit.Data.Linq.ParseInfoExtension.<>c__DisplayClass5.<IsQueryableMethod>b__1(ParseInfo`1 l)
в BLToolkit.Data.Linq.ParseInfoExtension.IsMethod(ParseInfo`1 pi, Type declaringType, String methodName, Func`2[] args, Func`2 func)
в BLToolkit.Data.Linq.ParseInfoExtension.IsQueryableMethod(ParseInfo`1 pi, Func`3 lambda)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass4e.<ParseSequenceInternal>b__1c(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequenceInternal(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildSubQuery(ParseInfo expr, QuerySource query, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass8a.<BuildNewExpression>b__88(ParseInfo pi)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass2d.<Walk>b__28(MemberBinding b, ParseInfo pinf)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass22`1.<Walk>b__21(T e, Int32 i)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, MethodInfo property, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNewExpression(QuerySource query, ParseInfo expr, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNew(QuerySource query, ParseInfo expr, Action`1 newAction)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass72.<BuildSelect>b__6e(Expr expr)
в BLToolkit.Data.Linq.QuerySource.Match(Action`1 tableAction, Action`1 exprAction, Action`1 subQueryAction, Action`1 scalarAction, Action`1 groupByAction)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildSelect(QuerySource query, Action`2 queryAction, Action`1 newAction, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
...


3) При раскомментировании Moderatorials так же вылетает:
System.ArgumentException: Свойство "Int32 MessageID" не определено для типа "Rsdn.Janus.DataModel.ForumMessage"
в System.Linq.Expressions.Expression.Property(Expression expression, PropertyInfo property)
в System.Linq.Expressions.Expression.MakeMemberAccess(Expression expression, MemberInfo member)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass25`1.<Walk>b__24(T e, Int32 i)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass2d.<Walk>b__28(MemberBinding b, ParseInfo pinf)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass22`1.<Walk>b__21(T e, Int32 i)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, MethodInfo property, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNewExpression(QuerySource query, ParseInfo expr, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNew(QuerySource query, ParseInfo expr, Action`1 newAction)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass72.<BuildSelect>b__6e(Expr expr)
в BLToolkit.Data.Linq.QuerySource.Match(Action`1 tableAction, Action`1 exprAction, Action`1 subQueryAction, Action`1 scalarAction, Action`1 groupByAction)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildSelect(QuerySource query, Action`2 queryAction, Action`1 newAction, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
...


4) При раскомментировании Rates опять же вылетает:
System.ArgumentException: Queryable method call expected. Got 'value(Rsdn.Janus.Msg+<>c__DisplayClass16).rates.Where(r => ((r.MessageID = m.ID) && (Convert(r.RateType) > 0))).Sum(r => (Convert(r.RateType) * Convert(r.Multiplier)))'.
Имя параметра: info
в BLToolkit.Data.Linq.ExpressionParser`1.<ParseSequenceInternal>b__4c(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequenceInternal(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.ParseSequence(ParseInfo info)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildSubQuery(ParseInfo expr, QuerySource query, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass8a.<BuildNewExpression>b__88(ParseInfo pi)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Expression e, MethodInfo property, Func`2 func)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass2d.<Walk>b__28(MemberBinding b, ParseInfo pinf)
в BLToolkit.Data.Linq.ParseInfo.<>c__DisplayClass22`1.<Walk>b__21(T e, Int32 i)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(IEnumerable`1 source, MethodInfo property, Func`3 func)
в BLToolkit.Data.Linq.ParseInfo.Walk(Func`2 func)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNewExpression(QuerySource query, ParseInfo expr, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildNew(QuerySource query, ParseInfo expr, Action`1 newAction)
в BLToolkit.Data.Linq.ExpressionParser`1.<>c__DisplayClass72.<BuildSelect>b__6e(Expr expr)
в BLToolkit.Data.Linq.QuerySource.Match(Action`1 tableAction, Action`1 exprAction, Action`1 subQueryAction, Action`1 scalarAction, Action`1 groupByAction)
в BLToolkit.Data.Linq.ExpressionParser`1.BuildSelect(QuerySource query, Action`2 queryAction, Action`1 newAction, Func`2 converter)
в BLToolkit.Data.Linq.ExpressionParser`1.<Parse>b__b(ParseInfo`1 pi)
в BLToolkit.Data.Linq.ParseInfo`1.Match(Func`2[] matches)
в BLToolkit.Data.Linq.ExpressionParser`1.Parse(DataProviderBase dataProvider, MappingSchema mappingSchema, Expression expression, ParameterExpression[] parameters)
...
AVK Blog
Re: Запрос не работает
От: Jack128  
Дата: 15.01.10 13:51
Оценка:
Здравствуйте, AndrewVK, Вы писали:

такой запрос не работает.


            var tmp = (from folder in storage.RFolders
                       where folder.RFOLDERID == parentId
                       select new
                       {
                           id = folder.ID,
                           Caption = folder.TITLE,
                           HasChilds =
                             storage.RFolders.Where(f => f.RFOLDERID == folder.ID).Any() ? 1 : 0
                       }).ToArray();


Хотя у АндреяVK тут
Автор: AndrewVK
Дата: 06.01.10
case вроде генерится.
а у мя

SELECT
    folder.ID,
    folder.TITLE,
    (
        SELECT
            *
        FROM rdb$database
        WHERE
            EXISTS(
                SELECT
                    *
                FROM
                    RFolders f
                WHERE
                    f.RFOLDERID = f.ID
            )
    ) as c1
FROM
    RFolders folder
WHERE
    folder.RFOLDERID = @parentId


DB специфик ?? У мя fb.
   в BLToolkit.Data.DbManager.OnOperationException(OperationType op, DataException ex) в S:\LicServer.New\Lib\BLToolkit\Source\Data\DbManager.cs:строка 566
   в BLToolkit.Data.DbManager.HandleOperationException(OperationType op, Exception ex) в S:\LicServer.New\Lib\BLToolkit\Source\Data\DbManager.cs:строка 4299
   в BLToolkit.Data.DbManager.ExecuteOperation[T](OperationType operationType, Func`1 operation) в S:\LicServer.New\Lib\BLToolkit\Source\Data\DbManager.cs:строка 4285
   в BLToolkit.Data.DbManager.ExecuteReaderInternal(CommandBehavior commandBehavior) в S:\LicServer.New\Lib\BLToolkit\Source\Data\DbManager.cs:строка 580
   в BLToolkit.Data.DbManager.ExecuteReader(CommandBehavior commandBehavior) в S:\LicServer.New\Lib\BLToolkit\Source\Data\DbManager.cs:строка 3469
   в BLToolkit.Data.DbManager.ExecuteReaderInternal() в S:\LicServer.New\Lib\BLToolkit\Source\Data\DbManager.cs:строка 575
   в BLToolkit.Data.DbManager.ExecuteReader() в S:\LicServer.New\Lib\BLToolkit\Source\Data\DbManager.cs:строка 3456
   в BLToolkit.Data.Linq.ExpressionInfo`1.GetReader(DbManager db, Expression expr, Object[] parameters, Int32 idx) в S:\LicServer.New\Lib\BLToolkit\Source\Data\Linq\ExpressionInfo.cs:строка 283
   в BLToolkit.Data.Linq.ExpressionInfo`1.<Query>d__1a.MoveNext() в S:\LicServer.New\Lib\BLToolkit\Source\Data\Linq\ExpressionInfo.cs:строка 234
   в BLToolkit.Data.Linq.ExpressionInfo`1.<Map>d__28.MoveNext() в S:\LicServer.New\Lib\BLToolkit\Source\Data\Linq\ExpressionInfo.cs:строка 256
   в System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   в System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   в LicServer.Site.Models.FolderChildsModel.Create(IDataStorage storage, Int64 parentId) в S:\LicServer.New\LicServer.Site\Models\RStructModels.cs:строка 35
   в LicServer.Site.Models.RStructModel.Create(IDataStorage storage, Int64 branchId) в S:\LicServer.New\LicServer.Site\Models\RStructModels.cs:строка 94
   в LicServer.Site.Controllers.RStructController.BranchStruct(Int64 branchId) в S:\LicServer.New\LicServer.Site\Controllers\RStructController.cs:строка 16
   в lambda_method(ExecutionScope , ControllerBase , Object[] )
   в System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   в System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   в System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   в System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   в System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
Re[2]: Запрос не работает
От: Jack128  
Дата: 22.01.10 10:09
Оценка: 58 (1)
Здравствуйте, Jack128, Вы писали:

не работает такой код:


        [TestMethod]
        public void Count_от_сортированного_запроса()
        {
            using (var manager = new DbManager())
            {
                var branches = manager.GetTable<Branch>().OrderBy(b => b.TITLE);
                branches.Count();                
            }
        }



на выходе


SELECT
    Count(*) as cnt
FROM
    Branches b
ORDER BY
    b.TITLE



ну почему он не работает — это понятно, агрегат с сортировкой не дружит. Просто хотелось бы чтоб работал -) нуно это например для таких вариантов:


    public class PaginatedList<T> : System.Collections.ObjectModel.Collection<T> // постраничная разбивка результатов любого запроса
    {    
        public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize) 
            : base(new ReadOnlyCollection<T>(source.Skip(pageSize * pageIndex).Take(pageSize).ToArray()))
        {
            TotalCount = source.Count();
            PageIndex = pageIndex;
            PageSize = pageSize;
            TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
        }


собственно вариантов решения два: либо при вызове Count() откидывать выражения OrderBy. Либо же заворачивать оригинальный запрос source в подзапрос навроде такого:


SELECT
    Count(*) as cnt
FROM (select * from
         Branches b
      ORDER BY
         b.TITLE
     )
Re[3]: Запрос не работает
От: IT Россия linq2db.com
Дата: 22.01.10 15:39
Оценка:
Здравствуйте, Jack128, Вы писали:

J>собственно вариантов решения два: либо при вызове Count() откидывать выражения OrderBy. Либо же заворачивать оригинальный запрос source в подзапрос навроде такого:


Будем делать и так и так. Не все провайдеры поддерживают сортировку в подзапросах. Но если кроме OrderBy у нас ещё и Take проскочит, то деваться уже некуда, придётся заводить подзапрос.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.