Последний bltoolkit, SQLite и непонятный Assert
От: senglory  
Дата: 20.09.11 04:50
Оценка: 68 (1)
здесь лежит проект, к-рый выстреливает assert на таком коде:

Imports System
Imports System.Collections.Generic

Imports BLToolkit.Data
Imports BLToolkit.Data.Linq
Imports BLToolkit.DataAccess
Imports BLToolkit.Data.Sql.SqlProvider
Imports BLToolkit.Data.DataProvider

Imports System.Data.SQLite


Module Module1

    Sub Main()
        Dim CONNECTION_STRING_TEMPLATE As String = "Data Source={0};Synchronous=Full;"
        Dim cnsOffline As String = String.Format(CONNECTION_STRING_TEMPLATE, "C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\BLToolkitTest4\BLToolkitTest4\Backdrop.db")
        Using dbmBackdrop As New GroupCalendarDBManager(New SQLiteDataProvider(), cnsOffline)
            Dim oSrcFromB = (From a In dbmBackdrop.Appointments _
                              Where Not a.IsDeleted And a.ByDelegateFrom = "11" _
                              And (a.UpdateStatus = UPDATESTATUS.Accepted Or a.UpdateStatus = UPDATESTATUS.UpdateForOwner Or a.UpdateStatus = UPDATESTATUS.SubmittedToOnline) _
                              Select a).ToList()
            Debug.Assert(oSrcFromB.Count = 0)
            '            Console.WriteLine(s)
            '            Console.ReadKey()
        End Using
    End Sub
End Module


bltoolkit последний. В чем причина такого косяка?
Re: Последний bltoolkit, SQLite и непонятный Assert
От: senglory  
Дата: 20.09.11 06:20
Оценка:
Причем если написать так:

            Dim oSrcFromB = (From a In dbmBackdrop.Appointments _
                              Where Not a.IsDeleted And a.ByDelegateFrom = "11" _
                              Select a).ToList()


то поразительным образом возвращаемый список становится пустым (это, собственно говоря, и есть ожидаемое поведение). Но почему применение операции AND добавляет возвращаемые данные, а не урезает их —
Re: Последний bltoolkit, SQLite и непонятный Assert
От: IT Россия linq2db.com
Дата: 20.09.11 18:48
Оценка:
Здравствуйте, senglory, Вы писали:

S>bltoolkit последний. В чем причина такого косяка?


Причина в том, что VB вместо AndAlso/OrAlso генерирует And/Or, которые являются битовыми операциями. Это либо никогда не работало, либо Майкрософт что-то улучшил в последних версиях VB.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Последний bltoolkit, SQLite и непонятный Assert
От: fddima  
Дата: 20.09.11 18:55
Оценка:
Здравствуйте, IT, Вы писали:

S>>bltoolkit последний. В чем причина такого косяка?

IT>Причина в том, что VB вместо AndAlso/OrAlso генерирует And/Or, которые являются битовыми операциями. Это либо никогда не работало, либо Майкрософт что-то улучшил в последних версиях VB.
Наверное не совсем так, в VB
If expr1 Or expr2
приводит к тому что выражения expr1 и expr2 вычисляются всегда, вне зависимости от expr1. Поэтому в VB ввели AndAlso/OrAlso которые являются эквивалентами C-like мира.
Re: Последний bltoolkit, SQLite и непонятный Assert
От: IT Россия linq2db.com
Дата: 20.09.11 18:56
Оценка:
Здравствуйте, senglory, Вы писали:

S>bltoolkit последний. В чем причина такого косяка?


VB на And генерирует And, на AndAlso правильно генерирует AndAlso. В примере тоже следует сделать соответствующие изменения.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Последний bltoolkit, SQLite и непонятный Assert
От: fddima  
Дата: 20.09.11 19:03
Оценка:
Здравствуйте, IT, Вы писали:

IT>Причина в том, что VB вместо AndAlso/OrAlso генерирует And/Or, которые являются битовыми операциями. Это либо никогда не работало, либо Майкрософт что-то улучшил в последних версиях VB.

В догонку, с мсдн. Это не баг.

Note
In a Boolean comparison, the Or operator always evaluates both expressions, which could include making procedure calls. The OrElse Operator (Visual Basic) performs short-circuiting, which means that if expression1 is True, then expression2 is not evaluated.

Re[3]: Последний bltoolkit, SQLite и непонятный Assert
От: IT Россия linq2db.com
Дата: 20.09.11 19:07
Оценка:
Здравствуйте, fddima, Вы писали:

IT>>Причина в том, что VB вместо AndAlso/OrAlso генерирует And/Or, которые являются битовыми операциями. Это либо никогда не работало, либо Майкрософт что-то улучшил в последних версиях VB.

F> В догонку, с мсдн. Это не баг.
F>

Note
F>In a Boolean comparison, the Or operator always evaluates both expressions, which could include making procedure calls. The OrElse Operator (Visual Basic) performs short-circuiting, which means that if expression1 is True, then expression2 is not evaluated.


Тогда бы и генерировать надо бы AndAlso. А так они генерируют битовую операцию, которая:

Add — An addition operation, such as a + b, without overflow checking, for numeric operands.


Так что бага.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Последний bltoolkit, SQLite и непонятный Assert
От: fddima  
Дата: 20.09.11 19:14
Оценка:
Здравствуйте, IT, Вы писали:

IT>Тогда бы и генерировать надо бы AndAlso. А так они генерируют битовую операцию, которая:

IT>

IT>Add — An addition operation, such as a + b, without overflow checking, for numeric operands.

Какой ещё Add? And/Or генерируют они. Они в VB и битовые и они же логические.
Re[5]: Последний bltoolkit, SQLite и непонятный Assert
От: IT Россия linq2db.com
Дата: 20.09.11 19:19
Оценка:
Здравствуйте, fddima, Вы писали:

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


IT>>Тогда бы и генерировать надо бы AndAlso. А так они генерируют битовую операцию, которая:

IT>>

IT>>Add — An addition operation, such as a + b, without overflow checking, for numeric operands.

F> Какой ещё Add? And/Or генерируют они. Они в VB и битовые и они же логические.

Виноват. См. Linq.Expression And.

And — A bitwise or logical AND operation, such as (a & b) in C# and (a And b) in Visual Basic.

Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Последний bltoolkit, SQLite и непонятный Assert
От: fddima  
Дата: 20.09.11 19:28
Оценка:
Здравствуйте, IT, Вы писали:

IT>Виноват. См. Linq.Expression And.

IT>

IT>And — A bitwise or logical AND operation, such as (a & b) in C# and (a And b) in Visual Basic.


Фуф, в VB6 не было никаких AndAlso и OrElse, а были только And и Or.
Их оставили разумеется и в VB.NET, т.к. менять их на AndAlso/OrElse нельзя т.к. у них другая семантика (вычислить слева, вычислить справа агрумент).

VB: If Func1() Or Func2() ...

эквивалент в C#:

bool a1 = Func1();
bool a2 = Func2();
if (a1 && b2) ...

Поэтому и expression компилятор VB генерирует правильный, никто же не запрещает сделать предикат с сайд-эффектом.

Ну а VB-шный And/Or просто идеально ложится на существующие битовые операции.
Re[7]: Последний bltoolkit, SQLite и непонятный Assert
От: fddima  
Дата: 20.09.11 19:29
Оценка:
Здравствуйте, fddima, Вы писали:

F>if (a1 && b2) ...

^^^^^^^^^^^^^ конечно же имелось ввиду if (a1 || b2) ...
Re[7]: Последний bltoolkit, SQLite и непонятный Assert
От: IT Россия linq2db.com
Дата: 20.09.11 21:57
Оценка:
Здравствуйте, fddima, Вы писали:

F>Фуф, в VB6 не было никаких AndAlso и OrElse, а были только And и Or.

F>Их оставили разумеется и в VB.NET, т.к. менять их на AndAlso/OrElse нельзя т.к. у них другая семантика (вычислить слева, вычислить справа агрумент).

А у SQL какая семантика?

F>Поэтому и expression компилятор VB генерирует правильный, никто же не запрещает сделать предикат с сайд-эффектом.


Сделать, конечно, можно любой бред. Только стоит ли?
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: Последний bltoolkit, SQLite и непонятный Assert
От: fddima  
Дата: 20.09.11 23:50
Оценка:
Здравствуйте, IT, Вы писали:

F>>Их оставили разумеется и в VB.NET, т.к. менять их на AndAlso/OrElse нельзя т.к. у них другая семантика (вычислить слева, вычислить справа агрумент).

IT>А у SQL какая семантика?
Linq ведь не только ж для SQL применим.

F>>Поэтому и expression компилятор VB генерирует правильный, никто же не запрещает сделать предикат с сайд-эффектом.

IT>Сделать, конечно, можно любой бред. Только стоит ли?
Тут я х.з.
VB.NET так сильно изменился по сравнению с VB6 — что, лично я бы и And/Or заменил бы на нормальные. В задачах перехода с VB6->VB.NET этот вопрос становится самым не существенным.
Re[9]: Последний bltoolkit, SQLite и непонятный Assert
От: IT Россия linq2db.com
Дата: 21.09.11 00:28
Оценка:
Здравствуйте, fddima, Вы писали:

IT>>А у SQL какая семантика?

F> Linq ведь не только ж для SQL применим.

Зато мы тут об SQL говорим. Хотелось бы знать.

F> VB.NET так сильно изменился по сравнению с VB6 — что, лично я бы и And/Or заменил бы на нормальные. В задачах перехода с VB6->VB.NET этот вопрос становится самым не существенным.


В принципе там делов на 5 минут и 12 секунд, но хотелось бы сделать правильно. Надо глянуть как у MS сделано.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Последний bltoolkit, SQLite и непонятный Assert
От: IT Россия linq2db.com
Дата: 21.09.11 00:41
Оценка:
Здравствуйте, senglory, Вы писали:

S>здесь лежит проект, к-рый выстреливает assert на таком коде:


Fixed.
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Последний bltoolkit, SQLite и непонятный Assert
От: fddima  
Дата: 21.09.11 08:02
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>А у SQL какая семантика?

F>> Linq ведь не только ж для SQL применим.
IT>Зато мы тут об SQL говорим. Хотелось бы знать.
Афаик, стандартом short-circuit evaluation разрешен, но не обязателен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.