BLToolkit 4.1 released
От: IT Россия linq2db.com
Дата: 25.06.11 19:33
Оценка: 57 (8)
Вышла версия 4.1 библиотеки.

По большому счёту изменение только одно, но оно вполне тянет на подверсию — полностью переписан конвертер Linq выражений. В результате большинство багов, связанных с неправильной обработкой выражений должно исчезнуть.

Просьба потестировать новую версию. Если с ней возникнут какие-либо трудности, то на старый конвертер можно переключиться, добавив символ условной компиляции 'OLD_PARSER'.

С этого момента принимаются пожелания по дальнейшему развитию библиотеки
Если нам не помогут, то мы тоже никого не пощадим.
Re: BLToolkit 4.1 released
От: MozgC США http://nightcoder.livejournal.com
Дата: 25.06.11 20:52
Оценка:
Я уже в продакшене потихоньку использую, пока багов не видим (все методы использующие BLToolkit покрыты тестами), но есть пожелания, повторюсь:

Merge
Автор: Holms
Дата: 15.02.10

Упрощение запросов с оптимистической блокировкой
Автор:
Дата: 11.03.10

Упрощение left join
Автор: MozgC
Дата: 25.03.11
— тут сильно упростить не получится, но хотя бы немного думаю можно (см. мой последний пост)

Это пока то, чего лично нам сейчас не хватает больше всего..
Баг: InsertBatch - Unexpected existing transaction
От: rameel https://github.com/rsdn/CodeJam
Дата: 26.06.11 23:38
Оценка: 76 (1)
Здравствуйте, IT, Вы писали:

IT>Просьба потестировать новую версию.


Сломался код, использующий InsertBatch в транзакции.

Откатился до версии от 10 мая 05:59:40 (Commit hash: 2dfd9a94d59f291f667eea21a8eb3949edffdf7b, Comment: Working on Linq) — работает, обновляюсь до текущей — валится с таким исключением Unexpected existing transaction.
System.InvalidOperationException : Unexpected existing transaction.
at System.Data.SqlClient.SqlBulkCopy.AnalyzeTargetAndCreateUpdateBulkCommand(BulkCopySimpleResultSet internalResults)
at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternal()
at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader reader)
at BLToolkit.Data.DataProvider.SqlDataProviderBase.InsertBatch(DbManager db, String insertText, IEnumerable`1 collection, MemberMapper[] members, Int32 maxBatchSize, ParameterProvider`1 getParameters) in d:\Projects\BLToolkit\Source\Data\DataProvider\SqlDataProviderBase.cs: line 233
at BLToolkit.DataAccess.SqlQuery`1.Insert(DbManager db, Int32 maxBatchSize, IEnumerable`1 list) in d:\Projects\BLToolkit\Source\DataAccess\SqlQueryT.cs: line 171
at BLToolkit.Data.Linq.Extensions.InsertBatch(DbManager dataContext, Int32 maxBatchSize, IEnumerable`1 list) in d:\Projects\BLToolkit\Source\Data\Linq\Extensions.cs: line 201
at BLToolkit.Data.Linq.Extensions.InsertBatch(DbManager dataContext, IEnumerable`1 list) in d:\Projects\BLToolkit\Source\Data\Linq\Extensions.cs: line 206


Код для воспроизведения
CREATE TABLE [dbo].[SqlBulkCopyTest](
    [ID]    int IDENTITY(1,1) NOT NULL,
    [Value] nvarchar(50)      NOT NULL,
    CONSTRAINT [PK_SqlBulkCopyTest] PRIMARY KEY CLUSTERED ([ID] ASC)
)

public class SqlBulkCopyTest
{
    [Identity, PrimaryKey]
    public int    ID    { get; set; }
    public string Value { get; set; }
}

[Test]
public void InsertBatchTest()
{
    var list = new[]
        {
            new SqlBulkCopyTest { Value = "1" },
            new SqlBulkCopyTest { Value = "2" },
            new SqlBulkCopyTest { Value = "3" },
            new SqlBulkCopyTest { Value = "4" }
        };

    using (var db = new DbManager())
    {
        db.BeginTransaction();
        db.InsertBatch(list);
        db.CommitTransaction();
    }
}
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: Баги
От: rameel https://github.com/rsdn/CodeJam
Дата: 26.06.11 23:38
Оценка: 76 (1)
Здравствуйте, IT, Вы писали:

IT>Просьба потестировать новую версию.


О багах.

1. Сломался такой код. В режиме 'OLD_PARSER' работает.
public override void AddUsersToRoles(string[] userNames, string[] roleNames)
{
    if (userNames == null) throw new ArgumentNullException("userNames");
    if (roleNames == null) throw new ArgumentNullException("roleNames");

    if (userNames.Length == 0 || roleNames.Length == 0)
        return;

    using (var db = _dbFactory.CreateDbManager())
    {
        var q = 
            from r  in db.Roles()
            from a  in db.Accounts()
            join ar in db.AccountRoles()
                on new { AccountID = a.ID, RoleID = r.ID } equals new { ar.AccountID, ar.RoleID } into lj
            from ar in lj.DefaultIfEmpty()
            where
                !((int?)ar.RoleID).HasValue
                    && roleNames.Contains(r.Name)
                    && userNames.Contains(a.Email)
            select new AccountRole
                {
                    AccountID = a.ID,
                    RoleID    = r.ID
                };

        q.Insert(
            db.AccountRoles(),
            ar => new AccountRole {AccountID = ar.AccountID, RoleID = ar.RoleID});
    }
}


Вызывается так:
roleMgr.AddUsersToRoles(new[] {email}, new[] {role});

Exception: Sequence 'value(AspRoleProvider+<>c__DisplayClass19).db.Accounts()' cannot be converted to SQL.

BLToolkit.Data.Linq.LinqException : Sequence 'value(AspRoleProvider+<>c__DisplayClass19).db.Accounts()' cannot be converted to SQL.
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 160
at BLToolkit.Data.Linq.Builder.SelectManyBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\SelectManyBuilder.cs: line 34
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 147
at BLToolkit.Data.Linq.Builder.JoinBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\JoinBuilder.cs: line 40
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 147
at BLToolkit.Data.Linq.Builder.SelectManyBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\SelectManyBuilder.cs: line 21
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 147
at BLToolkit.Data.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\WhereBuilder.cs: line 18
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 147
at BLToolkit.Data.Linq.Builder.SelectBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\SelectBuilder.cs: line 36
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 147
at BLToolkit.Data.Linq.Builder.InsertBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\InsertBuilder.cs: line 20
at BLToolkit.Data.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\MethodCallBuilder.cs: line 22
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 147
at BLToolkit.Data.Linq.Builder.ExpressionBuilder.Build() in d:\Projects\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs: line 118
at BLToolkit.Data.Linq.Query`1.GetQuery(IDataContextInfo dataContextInfo, Expression expr) in d:\Projects\BLToolkit\Source\Data\Linq\Query.cs: line 136
at BLToolkit.Data.Linq.Table`1.GetQuery(Expression expression, Boolean cache) in d:\Projects\BLToolkit\Source\Data\Linq\TableT.cs: line 106
at BLToolkit.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute(Expression expression) in d:\Projects\BLToolkit\Source\Data\Linq\TableT.cs: line 179
at BLToolkit.Data.Linq.LinqExtensions.Insert(IQueryable`1 source, Table`1 target, Expression`1 setter) in d:\Projects\BLToolkit\Source\Data\Linq\LinqExtensions.cs: line 441
at AspRoleProvider.AddUsersToRoles(String[] userNames, String[] roleNames) in AspRoleProvider.cs: line 242
at Tests.Security.MembershipTest.AccountTest() in MembershipTest.cs: line 94


Код сущностей:
[TableName("Roles")]
public class Role : EntityBase<Role>
{
    [Identity, PrimaryKey] public int    ID   { get; set; }
                [Required] public string Name { get; set; }
}
[TableName("Accounts")]
public class Account : EntityBase<Account>
{
    [Identity, PrimaryKey] public int    ID    { get; set; }
                [Required] public string Email { get; set; }
}
[TableName("AccountRoles")]
public class AccountRole : EntityBase<AccountRole>
{
    [Required, PrimaryKey(1)] public int AccountID { get; set; }
    [Required, PrimaryKey(2)] public int RoleID    { get; set; }
}
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: BLToolkit 4.1 released
От: rameel https://github.com/rsdn/CodeJam
Дата: 27.06.11 00:42
Оценка:
Здравствуйте, IT, Вы писали:

IT>Вышла версия 4.1 библиотеки.

IT>С этого момента принимаются пожелания по дальнейшему развитию библиотеки

1. INSERT без FROM http://rsdn.ru/Forum/Message.aspx?mid=4192235&amp;only=1
Автор: rameel
Дата: 13.03.11

INSERT TestTable(Data)
SELECT 'value'
WHERE 
    NOT EXISTS(SELECT Data FROM TestTable WHERE Data = 'value');

Хотя если будет MERGE, то уже не обязательно мне кажется делать перегрузку Insert/InsertWithIdentity с предикатом, как предлагалось, или может всё-таки нужно?

2. Есть такой, например, код:
using (var db = new DbManager())
{
    var q =
        from ar in db.AccountRoles()
        join r  in db.Roles()    on ar.RoleID    equals r.ID
        join a  in db.Accounts() on ar.AccountID equals a.ID
        where
            roleNames.Contains(r.Name) && userNames.Contains(a.Email)
        select ar;

    q.Delete();
}


То, какой код будет сгенерирован зависит Delete от того, что первым идет в linq-запросе, в данном случае будет такое:
DELETE [ar]
FROM
    [AccountRoles] [ar]
        INNER JOIN [Roles] [t1] ON [ar].[RoleID] = [t1].[ID]
        INNER JOIN [Accounts] [t2] ON [ar].[AccountID] = [t2].[ID]
WHERE
    [t1].[Name] IN ('admin') AND [t2].[Email] IN ('admin@site.com')


Если поменять запрос
using (var db = new DbManager())
{
    var q =
        from r  in db.Roles()
        join ar in db.AccountRoles() on r.ID         equals ar.RoleID
        join a  in db.Accounts()     on ar.AccountID equals a.ID
        where
            roleNames.Contains(r.Name) && userNames.Contains(a.Email)
        select ar;

    q.Delete();
}


то получим
DELETE [r]
FROM
    [Roles] [r]
        INNER JOIN [AccountRoles] [t1] ON [r].[ID] = [t1].[RoleID]
        INNER JOIN [Accounts] [t2] ON [t1].[AccountID] = [t2].[ID]
WHERE
    [r].[Name] IN ('admin') AND [t2].[Email] IN ('admin@site.com')


Можно с этим что-то сделать?

ЗЫ. Пока отлаживался нашлась опечатка в файле Source\DataAccess\SqlQueryInfo.cs, строка 91? memberss
ЗЫЫ. Попробывал сделать pull-request, отредактировав прям на странице гитхаба, но видать из-за разницы в окончаниях строк он пометил весь файл как измененный. Я наверное что-то не так делаю, но мой запрос не появился в реквестах
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: Баг: InsertBatch - Unexpected existing transaction
От: IT Россия linq2db.com
Дата: 27.06.11 03:25
Оценка:
Здравствуйте, rameel, Вы писали:

R>Сломался код, использующий InsertBatch в транзакции.


Fixed.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Баги
От: IT Россия linq2db.com
Дата: 27.06.11 03:27
Оценка:
Здравствуйте, rameel, Вы писали:

R>BLToolkit.Data.Linq.LinqException : Sequence 'value(AspRoleProvider+<>c__DisplayClass19).db.Accounts()' cannot be converted to SQL.


А как выглядит метод Accounts?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: BLToolkit 4.1 released
От: IT Россия linq2db.com
Дата: 27.06.11 03:37
Оценка:
Здравствуйте, rameel, Вы писали:

R>Можно с этим что-то сделать?


Разве что завести ещё один дополнительный параметр.

R>ЗЫ. Пока отлаживался нашлась опечатка в файле Source\DataAccess\SqlQueryInfo.cs, строка 91? memberss


Fixed.

R>ЗЫЫ. Попробывал сделать pull-request, отредактировав прям на странице гитхаба, но видать из-за разницы в окончаниях строк он пометил весь файл как измененный. Я наверное что-то не так делаю, но мой запрос не появился в реквестах


Может быть как-то можно настроить, но я не знаю. Лучше, конечно, по честному коммитить.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Баги
От: rameel https://github.com/rsdn/CodeJam
Дата: 27.06.11 03:52
Оценка:
Здравствуйте, IT, Вы писали:

IT>А как выглядит метод Accounts?


public static Table<Account> Accounts(this DbManager db)
{
    return db.GetTable<Account>();
}
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[3]: BLToolkit 4.1 released
От: rameel https://github.com/rsdn/CodeJam
Дата: 27.06.11 04:41
Оценка:
Здравствуйте, IT, Вы писали:

R>>Можно с этим что-то сделать?


IT>Разве что завести ещё один дополнительный параметр.


Было бы здорово! А то сейчас приходится завязываться на поведение, которое в будущем может изменится
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[2]: Баги
От: IT Россия linq2db.com
Дата: 27.06.11 17:59
Оценка: 21 (1)
Здравствуйте, rameel, Вы писали:

R>1. Сломался такой код. В режиме 'OLD_PARSER' работает.


Fixed.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Баги
От: rameel https://github.com/rsdn/CodeJam
Дата: 27.06.11 18:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>Fixed.


Отлично, теперь все тесты проходят, все работает
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: BLToolkit 4.1 released
От: Holms США  
Дата: 28.06.11 03:07
Оценка:
Здравствуйте, IT, Вы писали:

IT>Вышла версия 4.1 библиотеки.


интересно узнать как насчёт скорости, как новая версия себя ведёт?
Есть ли какой-то road-map для новых фич?

кстати, какой адрес svn с новой версией? а то здесь вроже как нету изменений?
... << RSDN@Home 1.2.0 alpha 5 (M4) rev. 1510>>
The life is relative and reversible.
Re[2]: BLToolkit 4.1 released
От: IT Россия linq2db.com
Дата: 28.06.11 04:49
Оценка:
Здравствуйте, Holms, Вы писали:

H>интересно узнать как насчёт скорости, как новая версия себя ведёт?


Так же. Скорость от разбора выражения практически не зависит.

H>Есть ли какой-то road-map для новых фич?


Пока в планах сделать поддержку чего-то вроде Include из EF и поддержку UpdateOrInset.

H>кстати, какой адрес svn с новой версией? а то здесь вроже как нету изменений?


https://github.com/igor-tkachev/bltoolkit
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: BLToolkit 4.1 released
От: Holms США  
Дата: 28.06.11 05:15
Оценка:
Здравствуйте, IT, Вы писали:

IT>https://github.com/igor-tkachev/bltoolkit

чего-то не хватает
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /Web -p Demo\Asp.Net\Web\ -u -f PrecompiledWeb\Web\
ASPNETCOMPILER : error ASPRUNTIME: Object reference not set to an instance of an object. [F:\svn\bl-toolkit-ex\bltoolkit\Web.metaproj]
Done Building Project "F:\svn\bl-toolkit-ex\bltoolkit\Web.metaproj" (Rebuild target(s)) -- FAILED.

Done Building Project "F:\svn\bl-toolkit-ex\bltoolkit\BLToolkit.2010.sln" (Rebuild target(s)) -- FAILED.


Build FAILED.

"F:\svn\bl-toolkit-ex\bltoolkit\BLToolkit.2010.sln" (Rebuild target) (1) ->
"F:\svn\bl-toolkit-ex\bltoolkit\Web.metaproj" (Rebuild target) (38) ->
(Rebuild target) ->
  ASPNETCOMPILER : error ASPRUNTIME: Object reference not set to an instance of an object. [F:\svn\bl-toolkit-ex\bltoolkit\Web.metaproj]

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:26.70


файла "Web.metaproj" нету.
... << RSDN@Home 1.2.0 alpha 5 (M4) rev. 1510>>
The life is relative and reversible.
Re[4]: BLToolkit 4.1 released
От: IT Россия linq2db.com
Дата: 28.06.11 12:59
Оценка:
Здравствуйте, Holms, Вы писали:

H>файла "Web.metaproj" нету.


Для сборки библиотеки в каталоге Source имеются два файла Compile3, Compile4 для соответствующих фреймворков.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: BLToolkit 4.1 released
От: Аноним  
Дата: 29.06.11 01:17
Оценка:
Здравствуйте, IT, Вы писали:

IT>UpdateOrInset.

Даешь SelectOrInsert!
Re[4]: BLToolkit 4.1 released
От: IT Россия linq2db.com
Дата: 29.06.11 02:29
Оценка:
Здравствуйте, Аноним, Вы писали:

IT>>UpdateOrInset.

А>Даешь SelectOrInsert!

Это как?
Если нам не помогут, то мы тоже никого не пощадим.
Re: BLToolkit 4.1 released
От: Аноним  
Дата: 29.06.11 06:34
Оценка: 1 (1)
Здравствуйте, IT, Вы писали:

IT>С этого момента принимаются пожелания по дальнейшему развитию библиотеки


Хорошо бы добавить дополнительную возможность генерить модель в стиле EF Code First. Всё больше появляется разного рода инструментов в VS которая завязана на EF модель. Например EF Code First and Data Scaffolding with the ASP.NET MVC 3
Re[2]: BLToolkit 4.1 released
От: IT Россия linq2db.com
Дата: 29.06.11 14:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хорошо бы добавить дополнительную возможность генерить модель в стиле EF Code First. Всё больше появляется разного рода инструментов в VS которая завязана на EF модель. Например EF Code First and Data Scaffolding with the ASP.NET MVC 3


В стиле EF Code First это без атрибутов?
Если нам не помогут, то мы тоже никого не пощадим.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.