[LinqToSql] почему полиморфизм не работате в запросе?

bastii

Есть запрос:
  
return db.Messages.Where(filterCondition).Select(m => new DisplayMessage
{
MessageId = m.MessageId,
TypeName = m.GetType.Name,
Time = m.Time,
SenderName = m.SenderId != null ? m.Sender.Name : null,
TargetName = m.TargetId != null ? m.Target.Name : null,
IsPrivate = m.Private,
Text = m.DisplayText
}).ToList;

причем у Messagе есть два подкласса, EnterMessage и LeaveMessage

public partial class Message
{
public virtual string DisplayText
{
get
{
return Text;
}
}
}

public partial class LeftMessage
{
public override string DisplayText
{
get
{
return "Left the location.";
}
}
}

public partial class EnteredMessage
{
public override string DisplayText
{
get
{
return "Entered the location.";
}
}
}


Почему то, для объектов, что соотв EnteredMessage и LeftMessage возвращается null, т.е. срабатывает код свойства DisplayMessage у Message.
Если запрос переделать так, то работает:

var messages = db.Messages.Where(filterCondition).ToList;

var displayMessages = messages.Select(m => new DisplayMessage
{
MessageId = m.MessageId,
TypeName = m.GetType.Name,
Time = m.Time,
SenderName = m.SenderId != null ? m.Sender.Name : null,
TargetName = m.TargetId != null ? m.Target.Name : null,
IsPrivate = m.Private,
Text = m.DisplayText
}).ToList;

return displayMessages;

Есть этому разумное объяснение?

Dasar

не хватает информации, что такое db.Messages:
массив, хитрая коллекция, коллекция генерируемая на лету?
ps
я правильно понимаю, что в первом случае ты действительно видишь, что у тебя в TypeName лежит "LeftMessage", а в Text-е лежит ""?

bastii

это LinqToSql
db - DataContext, который генерируется дизайнером, Messages — соотв. таблице, где есть столбец TypeId, настроено соответствие 0 - Message, 1 - EnteredMessage, 2 - LeftMessage.
Кусок из .dbml.

<Table Name="dbo.Messages" Member="Messages">
<Type Name="Message" InheritanceCode="0" IsInheritanceDefault="true">
<Column Name="MessageId" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
<Column Name="TypeId" Type="System.Int16" DbType="SmallInt NOT NULL" CanBeNull="false" IsDiscriminator="true" />
<Column Name="LocationId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<Column Name="SenderId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
<Column Name="TargetId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
<Column Name="Private" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
<Column Name="Time" AutoSync="Never" Type="System.DateTime" DbType="DateTime NOT NULL" IsDbGenerated="true" CanBeNull="false" />
<Column Name="Text" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
<Column Name="Param" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
<Association Name="Location_Message" Member="Location" ThisKey="LocationId" Type="Location" IsForeignKey="true" />
<Association Name="Character_Message" Member="Sender" ThisKey="SenderId" OtherKey="CharacterId" Type="Character" IsForeignKey="true" />
<Association Name="Character_Message1" Member="Target" ThisKey="TargetId" OtherKey="CharacterId" Type="Character" IsForeignKey="true" />
<Type Name="LeftMessage" InheritanceCode="2" />
<Type Name="EnteredMessage" InheritanceCode="1" />
</Type>
</Table>

bastii

psя правильно понимаю, что в первом случае ты действительно видишь, что у тебя в TypeName лежит "LeftMessage", а в Text-е лежит ""?
TypeName не проверял, в Text лежит null.

Dasar

так проверь, что лежит в TypeName

bastii

а какая разница, сравни два фрагмента кода, которые я выложил — вопрос, почему результаты разные, почему так должно быть.

Dasar

реальное выполнение происходит в разное время:
в первом куске - все идет вперемешку,
во втором куске - сначала получаются сообщения, а уже потом они преобразовываются.
соответственно - так могут себя проявлять разные size-эффекты.

bastii

ладно, будем разбираться
кажется, что такого быть не должно (ну т.е. результаты отличаться)

timefim

вопрос, почему результаты разные, почему так должно быть.
А по F11 пройтись и посмотреть что там внутрях творится?
Оставить комментарий
Имя или ник:
Комментарий: