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>>
В приведенном мной случае свежедобавленный 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>>
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>>
portion — объявлен как IEnumerable<int>, фактически int[]
генерит такой запрос
-- SQLite.default SQLiteSELECT 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>>
Здравствуйте, IT, Вы писали:
AVK>>portion — объявлен как IEnumerable<int>, фактически int[]
IT>Это пофиксил.
Не до конца. Сейчас такой запрос генерится
-- SQLite.default SQLiteSELECT 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>>
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)
...
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)
[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
)
Здравствуйте, Jack128, Вы писали:
J>собственно вариантов решения два: либо при вызове Count() откидывать выражения OrderBy. Либо же заворачивать оригинальный запрос source в подзапрос навроде такого:
Будем делать и так и так. Не все провайдеры поддерживают сортировку в подзапросах. Но если кроме OrderBy у нас ещё и Take проскочит, то деваться уже некуда, придётся заводить подзапрос.
Если нам не помогут, то мы тоже никого не пощадим.