Приведение откладывается и не вызывает немедленного выполнения. Это потому, что он (сам) не перечисляет источник. Запрос выполняется только тогда, когда что-то перечислено.
Upcasting не проблема. Запрос будет работать нормально.
Напомним - запрос работает со строками базы данных, а не с экземплярами. Экземпляры создаются только тогда, когда строки поступают локально. Все, что делает этот вызов cast, это изменяет ссылочный тип, используемый в результате - он не меняет тип экземпляра new'd up.
class SpecificObject : DomainObject
MyDataContext myDC = new MyDataContext();
IQueryable<DomainObject> query = myDC.SpecificObjects.Cast<DomainObject>();
Console.WriteLine(myDC.GetCommand(query).CommandText);
Но - это не очень полезно - поскольку свойства строки были в исходном типе, и теперь вы не можете ссылаться на эти свойства в оставшейся части запроса.
Даункастинг на самом деле мало что делает. LinqToSql предполагает, что каждая строка имеет тип T из Table<T>
. Не какой-то ТЧилд. Это сгенерирует запрос, выбирающий нуль для каждой строки в таблице.
class SpecificObject : DomainObject
MyDataContext myDC = new MyDataContext();
IQueryable<SpecificObject> query = myDC.DomainObjects.Cast<SpecificObject>();
Console.WriteLine(myDC.GetCommand(query).CommandText);
Неявное преобразование ... с этим нужно быть очень осторожным. Даже Enumerable.Cast<T>
LinqToObject не учитывает неявные операции преобразования (см. здесь и здесь ). Конечно, это не имеет ничего общего с LinqToSql - но принцип имеет значение - приведение .net не то же самое, что неявное преобразование c # и все, что связано с SQL. Вы должны иметь в виду среду исполнения кода, который вы пишете.