Re[5]: Linq bug?
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.10 22:58
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Без БД никак Я же написал, что метод сравнения експрешенов в тулките интернал. Поэтому проявить баг можно только в боевом режиме.


Собственно вот чистый тест воспроизводящий проблему:
using System;
using System.Console;
using Nemerle.Extensions;
using System.Linq.Expressions;

class Data
{
  public Id : Guid { get; set; }
}

module Program
{
  Main() : void
  {
    def toExpr(e : Expression[Func[Data, bool]]) { e }
    
    mutable id1 = Guid.NewGuid();
    mutable id2 = Guid.NewGuid();

    def e1 = toExpr(d => d.Id == id1);
    def e2 = toExpr(d => d.Id == id2);
    
    def f1 = e1.Compile();
    def f2 = e2.Compile();
    def d  = Data();
    d.Id = id1;
    
    WriteLine(f1(d));   
    WriteLine(f2(d));   
    id2 = id1;
    WriteLine(f1(d));   
    WriteLine(f2(d));   
  }
}


Теперь вместо Expression.Constant() для локальных переменных создается Expression.Field(замыкание, поле_из_замыкания), так что проблем быть не должно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Linq bug?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.10 15:20
Оценка:
Здравствуйте, IT, Вы писали:

IT>Guid в CLR в принципе нельзя объявить константой.


Казалось бы причем тут коснтсанты CLR? Речь идет о деревьях выражений в которых Constant — это не более чем захват значений.

IT>Если какая-либо программа учитывает этот факт, то кто будет виноват — компилятор или эта программа?


Пока что единственной программой которая учитывает "факт" — это твой провайдер. Остальные работают корректно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Linq bug?
От: IT Россия linq2db.com
Дата: 04.06.10 16:48
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>Guid в CLR в принципе нельзя объявить константой.

VD>Казалось бы причем тут коснтсанты CLR? Речь идет о деревьях выражений в которых Constant — это не более чем захват значений.

Именно формированием дерева выражения в ручную я этот баг и воспроизводил. А при желании ручным формированием деревьев выражений можно завалить любой провайдер. И сказать при это, что это не более чем дерево выражений, при чём тут компилятор.

IT>>Если какая-либо программа учитывает этот факт, то кто будет виноват — компилятор или эта программа?

VD>Пока что единственной программой которая учитывает "факт" — это твой провайдер. Остальные работают корректно.

А сколько ты их проверял?
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Linq bug?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.10 17:44
Оценка:
Здравствуйте, IT, Вы писали:

IT>Именно формированием дерева выражения в ручную я этот баг и воспроизводил. А при желании ручным формированием деревьев выражений можно завалить любой провайдер. И сказать при это, что это не более чем дерево выражений, при чём тут компилятор.


Ну, то есть то что все остальные провайдеры ведут себя нормально — это у них баг.

Кроме того нормальным по видимому является и то, что твой провадер вместо того чтобы сообщить пользователю о том, что переданное ему дерево выражений, с его точки зрения не корректно, просто выдает не верный результат.

"Хорошая" позиция.

IT>>>Если какая-либо программа учитывает этот факт, то кто будет виноват — компилятор или эта программа?

VD>>Пока что единственной программой которая учитывает "факт" — это твой провайдер. Остальные работают корректно.

IT>А сколько ты их проверял?


Столько сколько сделал Майкрософт.

Вообще, тут, на мой взгляд, даже обсуждать не чего. Учитывая, что провадеры все транслируют в SQL, нужно поддерживать и константы, и ссылки на поля для всех типов поддерживаемых SQL-серверами. Можем сериализовать в SQL? Значит надо поддерживать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Linq bug?
От: IT Россия linq2db.com
Дата: 04.06.10 18:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>"Хорошая" позиция.


Моя позиция простая — я тихо и без криков признал, что это баг и быстренько его пофиксил. Чем тебя не устраивает такая позиция?

IT>>А сколько ты их проверял?

VD>Столько сколько сделал Майкрософт.

Т.е. ровно один — Linq 2 SQL.

VD>Вообще, тут, на мой взгляд, даже обсуждать не чего. Учитывая, что провадеры все транслируют в SQL, нужно поддерживать и константы, и ссылки на поля для всех типов поддерживаемых SQL-серверами. Можем сериализовать в SQL? Значит надо поддерживать.


Так вот, те провайдер(ы), которые ты тестировал в константы вообще ничего не транслируют, а на каждый чих создают параметр. Т.е. если написать table.Field == 1, то в SQL ты получишь table.Field = @param1. Поэтому, у такого провайдера подобного баг быть не может в принципе. Но правильным ли является такой подход? Вот в чём вопрос.
Если нам не помогут, то мы тоже никого не пощадим.
Re[12]: Linq bug?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.10 18:22
Оценка:
Здравствуйте, IT, Вы писали:

IT>Моя позиция простая — я тихо и без криков признал, что это баг и быстренько его пофиксил. Чем тебя не устраивает такая позиция?


Такая позиция меня устаревает. Не ясно только тогда зачем были нужны высказывания в духе "в ЦЛР нет...".

IT>Так вот, те провайдер(ы), которые ты тестировал в константы вообще ничего не транслируют,


Провайдеры вообще не должны ничего траслировать. Их задача читать деревья выражений и герерить SQL.

IT>а на каждый чих создают параметр. Т.е. если написать table.Field == 1, то в SQL ты получишь table.Field = @param1. Поэтому, у такого провайдера подобного баг быть не может в принципе. Но правильным ли является такой подход? Вот в чём вопрос.


С полями разговор отдельный. Мы ведь говорили о значениях.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Linq bug?
От: IT Россия linq2db.com
Дата: 04.06.10 18:47
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>Моя позиция простая — я тихо и без криков признал, что это баг и быстренько его пофиксил. Чем тебя не устраивает такая позиция?

VD>Такая позиция меня устаревает. Не ясно только тогда зачем были нужны высказывания в духе "в ЦЛР нет...".

Потому что это на самом деле так. В CLR нельзя создать константу типа Guid.

IT>>Так вот, те провайдер(ы), которые ты тестировал в константы вообще ничего не транслируют,

VD>Провайдеры вообще не должны ничего траслировать. Их задача читать деревья выражений и герерить SQL.

Так вот, те провайдер(ы), которые ты тестировал константы в SQL вообще не генерируют.

IT>>а на каждый чих создают параметр. Т.е. если написать table.Field == 1, то в SQL ты получишь table.Field = @param1. Поэтому, у такого провайдера подобного баг быть не может в принципе. Но правильным ли является такой подход? Вот в чём вопрос.


VD>С полями разговор отдельный. Мы ведь говорили о значениях.


'1' — это и есть значение, которое L2S преобразует в параметр.
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: Linq bug?
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.10 09:38
Оценка:
Здравствуйте, IT, Вы писали:

IT>Потому что это на самом деле так. В CLR нельзя создать константу типа Guid.


Несомненно. Только к делу не относится.

IT>Так вот, те провайдер(ы), которые ты тестировал константы в SQL вообще не генерируют.

IT>...'1' — это и есть значение, которое L2S преобразует в параметр.

В этом есть свой резон. Но опять же мо не об этом говорим.

ЗЫ

Вдумайся. В шарпе есть всего несколько типов кроторые переврдятся с литералы. Зачем тогда в Expression.Conctant воспользовалисс object-ом, а не сделоло несколько перегрузок, как сделали с функциях вроде Sum?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Linq bug?
От: IT Россия linq2db.com
Дата: 05.06.10 14:36
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вдумайся. В шарпе есть всего несколько типов кроторые переврдятся с литералы. Зачем тогда в Expression.Conctant воспользовалисс object-ом, а не сделоло несколько перегрузок, как сделали с функциях вроде Sum?


Почему object? Хотя бы потому что null — это тоже константа.
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: Linq bug?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 11:50
Оценка: 1 (1)
Здравствуйте, IT, Вы писали:

IT>Почему object? Хотя бы потому что null — это тоже константа.


Его можно было бы и отдельной веткой АСТ прописать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.