Union с абстрактными классами
От: Danchik Украина  
Дата: 29.09.11 15:06
Оценка: 68 (1)
Привет,

Попробовал сделать Union таблицы и наткнулся на такую проблему (упрощено до репродюса)


[TableName(Name="SomeTable")]
public abstract class SomeTable
{
 // some abstract fields
}

var res = manager.GetTable<SomeTable>()
  .Union(manager.GetTable<SomeTable>())
  .ToList();


И получил

System.InvalidOperationException was unhandled
  Message=Instances of abstract classes cannot be created.
  Source=mscorlib
  StackTrace:
       at System.Runtime.CompilerServices.RuntimeHelpers._CompileMethod(IRuntimeMethodInfo method)
       at System.Reflection.Emit.DynamicMethod.CreateDelegate(Type delegateType, Object target)
       at System.Dynamic.Utils.TypeExtensions.CreateDelegate(MethodInfo methodInfo, Type delegateType, Object target)
       at System.Linq.Expressions.Compiler.LambdaCompiler.CreateDelegate()
       at System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator)
       at System.Linq.Expressions.Expression`1.Compile()
       at BLToolkit.Data.Linq.Builder.ConcatUnionBuilder.UnionContext.BuildQuery[T](Query`1 query, ParameterExpression queryParameter) in C:\!Dev.Open\BLToolkit\Source\Data\Linq\Builder\ConcatUnionBuilder.cs:line 144
       at BLToolkit.Data.Linq.Builder.ExpressionBuilder.Build[T]() in C:\!Dev.Open\BLToolkit\Source\Data\Linq\Builder\ExpressionBuilder.cs:line 164
       at BLToolkit.Data.Linq.Query`1.GetQuery(IDataContextInfo dataContextInfo, Expression expr) in C:\!Dev.Open\BLToolkit\Source\Data\Linq\Query.cs:line 130
       at BLToolkit.Data.Linq.Table`1.GetQuery(Expression expression, Boolean cache) in C:\!Dev.Open\BLToolkit\Source\Data\Linq\TableT.cs:line 106
       at BLToolkit.Data.Linq.Table`1.Execute(IDataContextInfo dataContextInfo, Expression expression) in C:\!Dev.Open\BLToolkit\Source\Data\Linq\TableT.cs:line 98
       at BLToolkit.Data.Linq.Table`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() in C:\!Dev.Open\BLToolkit\Source\Data\Linq\TableT.cs:line 191
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
....

Не кошерненько как то
Re: Union с абстрактными классами
От: IT Россия linq2db.com
Дата: 29.09.11 16:04
Оценка: 18 (1)
Здравствуйте, Danchik, Вы писали:

D>Не кошерненько как то


Fixed.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Union с абстрактными классами
От: fddima  
Дата: 30.09.11 07:18
Оценка: +1
Здравствуйте, Danchik, Вы писали:

D>И еще вопрос. Не правильнее ли генерить UNION ALL вместо простого UNION?

Нет, не правильнее. UNION ALL — это скорее линковый Concat.
Re: Union с абстрактными классами
От: IT Россия linq2db.com
Дата: 29.09.11 15:25
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Попробовал сделать Union таблицы и наткнулся на такую проблему (упрощено до репродюса)


Проверил на таком тесте, всё работает:

        [TableName("Parent")]
        public abstract class AbstractParent
        {
            public abstract int  ParentID { get; set; }
            public abstract int? Value1   { get; set; }
        }

        [Test]
        public void UnionAbstract1()
        {
            ForEachProvider(db =>
            {
                var q = db.GetTable<AbstractParent>().Union(db.GetTable<AbstractParent>());
                Assert.AreEqual(Parent.Count(), q.Count());
            });
        }
Если нам не помогут, то мы тоже никого не пощадим.
Re: Union с абстрактными классами
От: IT Россия linq2db.com
Дата: 29.09.11 15:27
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Не кошерненько как то


Смог повторить. Будем лечить.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Union с абстрактными классами
От: Danchik Украина  
Дата: 29.09.11 16:21
Оценка:
Здравствуйте, IT, Вы писали:

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


D>>Не кошерненько как то


IT>Fixed.


Что то по последним комитам в git не видно этого фикса
Re[3]: Union с абстрактными классами
От: IT Россия linq2db.com
Дата: 29.09.11 16:33
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Что то по последним комитам в git не видно этого фикса


https://github.com/igor-tkachev/bltoolkit/commit/bf1ea85cda0d6d1f7582524670327896f2bdf603
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Union с абстрактными классами
От: Danchik Украина  
Дата: 30.09.11 06:40
Оценка:
Здравствуйте, IT, Вы писали:

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


D>>Что то по последним комитам в git не видно этого фикса


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


Все от моего незнания Git.

И еще вопрос. Не правильнее ли генерить UNION ALL вместо простого UNION?
Re: Union с абстрактными классами
От: Jack128  
Дата: 30.09.11 07:29
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Привет,


D>Попробовал сделать Union таблицы и наткнулся на такую проблему (упрощено до репродюса)



D>
D>[TableName(Name="SomeTable")]
D>public abstract class SomeTable
D>{
D> // some abstract fields
D>}

D>var res = manager.GetTable<SomeTable>()
D>  .Union(manager.GetTable<SomeTable>())
D>  .ToList();
D>


А экземпляры каких конкретно классов мы получим в результате?? SomeTable же абстрактный, его нельзя создать.
Re[2]: Union с абстрактными классами
От: Danchik Украина  
Дата: 30.09.11 10:12
Оценка:
Здравствуйте, Jack128, Вы писали:

J>А экземпляры каких конкретно классов мы получим в результате?? SomeTable же абстрактный, его нельзя создать.


Где то в недрах тулкита создается эмитером наследник (TypeAccessor.CreateInstanceEx<T>()). Абстрактные свойства доопределяются.
Re[6]: Union с абстрактными классами
От: Danchik Украина  
Дата: 30.09.11 14:00
Оценка:
Здравствуйте, fddima, Вы писали:

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


D>>И еще вопрос. Не правильнее ли генерить UNION ALL вместо простого UNION?

F> Нет, не правильнее. UNION ALL — это скорее линковый Concat.

Linq To Object — Union == UNION ALL
Linq To SQL — Union == UNION

Linq To SQL — Concat == UNION ALL

Как бы понимаеш разницу. Но что то таки не нравится Nevermind
Re[7]: Union с абстрактными классами
От: fddima  
Дата: 30.09.11 14:02
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Linq To Object — Union == UNION ALL

Ээээ — это как? С чего бы? Если хочешь соединить две последовательности — всегда используй Concat.
Я вот недавно по ошибке написал Union, и вместо 5-ти элементов массива из Type, имел 4.
Re[6]: Union с абстрактными классами
От: IT Россия linq2db.com
Дата: 30.09.11 15:15
Оценка:
Здравствуйте, fddima, Вы писали:

D>>И еще вопрос. Не правильнее ли генерить UNION ALL вместо простого UNION?

F> Нет, не правильнее. UNION ALL — это скорее линковый Concat.

100% Concat
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Union с абстрактными классами
От: fddima  
Дата: 30.09.11 15:31
Оценка:
Здравствуйте, IT, Вы писали:

D>>>И еще вопрос. Не правильнее ли генерить UNION ALL вместо простого UNION?

F>> Нет, не правильнее. UNION ALL — это скорее линковый Concat.
IT>100% Concat
Это такой дурацкий оборот речи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.