здесь лежит проект, к-рый выстреливает 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
Dim oSrcFromB = (From a In dbmBackdrop.Appointments _
Where Not a.IsDeleted And a.ByDelegateFrom = "11" _
Select a).ToList()
то поразительным образом возвращаемый список становится пустым (это, собственно говоря, и есть ожидаемое поведение). Но почему применение операции AND добавляет возвращаемые данные, а не урезает их —
Re: Последний bltoolkit, SQLite и непонятный Assert
Здравствуйте, senglory, Вы писали:
S>bltoolkit последний. В чем причина такого косяка?
Причина в том, что VB вместо AndAlso/OrAlso генерирует And/Or, которые являются битовыми операциями. Это либо никогда не работало, либо Майкрософт что-то улучшил в последних версиях VB.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Последний bltoolkit, SQLite и непонятный Assert
Здравствуйте, 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, Вы писали:
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
Здравствуйте, 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, Вы писали:
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 и битовые и они же логические.
Здравствуйте, 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 нельзя т.к. у них другая семантика (вычислить слева, вычислить справа агрумент).
Здравствуйте, fddima, Вы писали:
F>Фуф, в VB6 не было никаких AndAlso и OrElse, а были только And и Or. F>Их оставили разумеется и в VB.NET, т.к. менять их на AndAlso/OrElse нельзя т.к. у них другая семантика (вычислить слева, вычислить справа агрумент).
А у SQL какая семантика?
F>Поэтому и expression компилятор VB генерирует правильный, никто же не запрещает сделать предикат с сайд-эффектом.
Сделать, конечно, можно любой бред. Только стоит ли?
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: Последний bltoolkit, SQLite и непонятный Assert
Здравствуйте, 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
Здравствуйте, fddima, Вы писали:
IT>>А у SQL какая семантика? F> Linq ведь не только ж для SQL применим.
Зато мы тут об SQL говорим. Хотелось бы знать.
F> VB.NET так сильно изменился по сравнению с VB6 — что, лично я бы и And/Or заменил бы на нормальные. В задачах перехода с VB6->VB.NET этот вопрос становится самым не существенным.
В принципе там делов на 5 минут и 12 секунд, но хотелось бы сделать правильно. Надо глянуть как у MS сделано.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Последний bltoolkit, SQLite и непонятный Assert
Здравствуйте, IT, Вы писали:
IT>>>А у SQL какая семантика? F>> Linq ведь не только ж для SQL применим. IT>Зато мы тут об SQL говорим. Хотелось бы знать.
Афаик, стандартом short-circuit evaluation разрешен, но не обязателен.