Здравствуйте, IT, Вы писали:
IT>Здравствуйте, ili, Вы писали:
IT>Кстати, похоже, что сломался тест NonUpdatableOnInsert. Надо бы починить.
да, вот только помоему он "починился".
NonUpdatable.OnInsert == false — означает, что при инсерте данное поле должно вставляться, по крайней мере я так понимаю (как минимум для Identity это именно так, там 2 true и оно не обновляется и не вставляется)
т.е. тест закрепляет неверное поведение.
вобщем, я его переделал, и закоммитил в dev (ну или постарался туда закоммититть )
ЗЫ по ходу пока я тебе полрепозитария не перекурочу, я так и не въеду в этот гит... хотя, он вроде крут, и чистить плоды моей деятельности особого труда не составляет...
ЗЫ2 а зачем всетаки TableBuilder-у 2 до боли одинаковых метода MapDataReaderToObject? неужно заради оптимизации?
ЗЫ3 да, посгрису иногда нужно делать все в lower\upper case... хотя, решение и вправду не очень, я как-то пару лет назад уже занимался миграциями и тогда до кучи все делал в ловер кейз, ну и просто дернул те наработки особо не мучаясь, а проблема в том, что посгрис начинает местами быть чувствительным к регистрам таблиц\полей, в особенности если писать их в "", а без "" зачастую низя, т.к. можно легко попасть в зарезервированные слова (у мя вот в базе часто встречается "From" )
скорее оставить надо, но перетащить в Convert... лана, руки дойдут — разберусь
Здравствуйте, ili, Вы писали:
ili>да, вот только помоему он "починился".
Он вообще был неправильный.
ili>вобщем, я его переделал, и закоммитил в dev (ну или постарался туда закоммититть )
Я же вроде уже починил. Ты опять переделал
ili>ЗЫ по ходу пока я тебе полрепозитария не перекурочу, я так и не въеду в этот гит... хотя, он вроде крут, и чистить плоды моей деятельности особого труда не составляет...
В этот раз лучшим решением было бы сделать Rebase на dev, чтобы не было таких загибонов как получилось
ili>ЗЫ2 а зачем всетаки TableBuilder-у 2 до боли одинаковых метода MapDataReaderToObject? неужно заради оптимизации?
Для неё. Один, конечно, можно убрать, но только не тот который ты убрал. Но с этим как-нибудь позже.
ili>ЗЫ3 да, посгрису иногда нужно делать все в lower\upper case... хотя, решение и вправду не очень, я как-то пару лет назад уже занимался миграциями и тогда до кучи все делал в ловер кейз, ну и просто дернул те наработки особо не мучаясь, а проблема в том, что посгрис начинает местами быть чувствительным к регистрам таблиц\полей, в особенности если писать их в "", а без "" зачастую низя, т.к. можно легко попасть в зарезервированные слова (у мя вот в базе часто встречается "From" )
У там тебе на гитхабе в комментариях вопрос задал по поводу upper, lower. Если не ошибаюсь у тебя там маленькая бага.
ili>скорее оставить надо, но перетащить в Convert... лана, руки дойдут — разберусь
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Я же вроде уже починил. Ты опять переделал
война коммитов!
ммм... я не нарочно... честно
IT>В этот раз лучшим решением было бы сделать Rebase на dev, чтобы не было таких загибонов как получилось
ты учти, что говоришь с дремучим парнем из уральского леса так что говорить надо по слогам и очень громко =)
это вот надо на шестую картинку смотреть?
Хотя там есть отдельная комманда Rebase они с 6-й картинкой не одно и то же?
IT>У там тебе на гитхабе в комментариях вопрос задал по поводу upper, lower. Если не ошибаюсь у тебя там маленькая бага.
да, теперь я понял как этим пользоваться =) надо было по ссылке вконце письма сходить =))
Здравствуйте, IT, Вы писали:
IT>Вышла версия 4.1 библиотеки.
Напоролся еще на один баг:
public class Root
{
public int ID { get; set; }
public string Value { get; set; }
public int InfoID { get; set; }
}
public class LeafToRoot
{
public int ID { get; set; }
public int RootID { get; set; }
public int LeafID { get; set; }
}
public class Leaf
{
public int ID { get; set; }
public int LeafRootID { get; set; }
public string LeafValue { get; set; }
}
private void TestInternal(Expression<Func<RootInfo, bool>> selector)
{
using (var db = new DbManager())
{
var roots = db.GetTable<Root>();
roots.Delete();
roots.Insert(() => new Root { ID = 1, Value = "First", InfoID = 1 });
roots.Insert(() => new Root { ID = 2, Value = "Second", InfoID = 1 });
roots.Insert(() => new Root { ID = 3, Value = "Third", InfoID = 1 });
var l2r = db.GetTable<LeafToRoot>();
l2r.Delete();
l2r.Insert(() => new LeafToRoot { ID = 1, LeafID = 1, RootID = 1 });
l2r.Insert(() => new LeafToRoot { ID = 2, LeafID = 2, RootID = 1 });
var leafs = db.GetTable<Leaf>();
leafs.Delete();
leafs.Insert(() => new Leaf { ID = 1, LeafRootID = 1, LeafValue = "blabla" });
leafs.Insert(() => new Leaf { ID = 2, LeafRootID = 2, LeafValue = "blahblah" });
DbManager.TurnTraceSwitchOn();
var q1 = from r in roots
orderby r.Value
select new RootInfo
{
ID = r.ID,
Value = r.Value,
};
q1 = q1.Where(selector);
var q2 = (from l in leafs
join lr in l2r on l.ID equals lr.LeafID
join r in q1 on lr.RootID equals r.ID
select new
{
r.ID,
LeafRootID = lr.ID,
LeafID = l.ID
}).ToList();
}
}
[Test]
public void Test()
{
// const string param = "ir"; // С константой работает!string param = "ir"; // А так -- падает!
TestInternal(i => i.Value.Contains(param));
}
При парсинге q2 наблюдаем exception:
System.ArgumentException : An item with the same key has already been added.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.ConvertLikePredicate(IBuildContext context, MethodCallExpression expression, String start, String end) in ExpressionBuilder.SqlBuilder.cs: line 1792
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.ConvertPredicate(IBuildContext context, Expression expression) in ExpressionBuilder.SqlBuilder.cs: line 1174
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSearchCondition(IBuildContext context, Expression expression, List`1 conditions) in ExpressionBuilder.SqlBuilder.cs: line 2001
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildWhere(IBuildContext parent, IBuildContext sequence, LambdaExpression condition, Boolean checkForSubQuery) in ExpressionBuilder.SqlBuilder.cs: line 38
at BLToolkit.Data.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in WhereBuilder.cs: line 20
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 178
at BLToolkit.Data.Linq.Builder.JoinBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\Builder\JoinBuilder.cs: line 42
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 178
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.Build() in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 149
at BLToolkit.Data.Linq.Query`1.GetQuery(IDataContextInfo dataContextInfo, Expression expr) in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\Query.cs: line 134
at BLToolkit.Data.Linq.Table`1.GetQuery(Expression expression, Boolean cache) in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\TableT.cs: line 106
at BLToolkit.Data.Linq.Table`1.Execute(IDataContextInfo dataContextInfo, Expression expression) in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\TableT.cs: line 98
at BLToolkit.Data.Linq.Table`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() in C:\Projects\bl-toolkit\bltoolkit.4.1\Source\Data\Linq\TableT.cs: line 193
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList(IEnumerable`1 source)
at BLTUnitTests.Tests.TestInternal(Expression`1 selector) in Tests.cs: line 49
at BLTUnitTests.Tests.Test() in Tests.cs: line 66
Если передать константу, то в методе ConvertLikePredicate() отрабатывает ветка
if (a is SqlValue)
{
...
}
и всё чики-пыки.
Если же передать переменную, то падает в ветке: