Если вы хотите получить RoomRate SingleRate. Тогда вместо использования
Eval("SingleRate")
Используйте
DataBinder.Eval(Container.DataItem, "RoomRate.SingleRate")
См. Этот небольшой пример (Код позади)
public class SomeObject
{
public Version Version { get; set; }
public string Description { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
var ls = new List<SomeObject>()
{
new SomeObject() {Description = "Test", Version = new Version(1, 1)},
new SomeObject() {Description = "Test2", Version = new Version(2, 1)}
};
gv.DataSource = ls;
gv.DataBind();
}
aspx:
<asp:GridView ID="gv" runat="server" Width="100%">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
Major</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="lblRoomType" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Version.Major") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Поскольку свойство DataKeyNames является строкой, а не выражением, я бы посоветовал вам создать для этого свойство. Итак, ваш объект выглядит так:
public class RoomRateWithRoomType
{
public BE_RoomRate RoomRate { get; set; }
public string RoomType { get; set; }
public int RoomRateId { get; set; }
}
И тогда в сетке вы можете использовать:
DataKeyNames="RoomRateId"
Чтобы избежать одного вызова базы данных на линию, измените это:
public IQueryable<RoomRateWithRoomType> RoomRateForAdmin()
{
var query= from rate in db.BE_RoomRates
join room in db.BE_Rooms
on rate.RoomId equals room.RoomId
where rate.Status!=3 && room.Status!=3
select new RoomRateWithRoomType()
{
RoomRate = rate,
RoomType = room.RoomType
};
return query;
}
К
public IEnumerable<RoomRateWithRoomType> RoomRateForAdmin()
{
var query= from rate in db.BE_RoomRates
join room in db.BE_Rooms
on rate.RoomId equals room.RoomId
where rate.Status!=3 && room.Status!=3
select new RoomRateWithRoomType()
{
RoomRate = rate,
RoomType = room.RoomType
};
return query.ToList();
}