转换MaterializedDataRecord到实体或为什么EntityDataSource打破我的实体
本文关键字:实体 我的 EntityDataSource MaterializedDataRecord 转换 为什么 | 更新日期: 2023-09-27 18:08:42
我使用的是EntityDataSource。当我把"Select"属性留空时,一切都很好——在SomeWebControl_DataBinding中,我可以完美地将网格的数据项转换为我的实体(让我们称之为USERS)。
Literal ctrlTime = (Literal)sender;
GridViewRow row = (GridViewRow)ctrlTime.NamingContainer;
USERS usersRow = (USERS)row.DataItem;
DateTime timestamp = usersRow.Time;
然而,我只需要显示表的前1000行,所以我所做的是填充EntityDataSource的"Select"属性,并将其设置为"TOP(1000) | 所有字段在实体中的列表|"。但是一旦我这样做了
USERS usersRow = (USERS)row.DataItem;
失败了,告诉我它不能从MaterializedDataRecord转换到USERS。
我最后做的是:
Literal ctrlTime = (Literal)sender;
GridViewRow row = (GridViewRow)ctrlTime.NamingContainer;
DbDataRecord usersRow = (DbDataRecord)row.DataItem;
DateTime timestamp = (DateTime)usersRow["Time"];
我可能会使用(MaterializedDataRecord)而不是(DbDataRecord),我只是不想吓到我的同事。现在,这是可行的,但是我发现它很丑,它有点破坏了使用EntityFramework的美。此外,这是一个非常基本的例子,在未来我可能会面临类似的情况,我需要框/解框许多其他字段,这看起来不太好。
所以我的问题是:是否有任何方法可以轻松地将MaterializedDataRecord转换为实体或设置EntityDataSource不考虑在"选择"中存在某些东西作为导致创建MaterializedDataRecord而不是实体的"威胁"?
我的意思是,如果我选择实体字段的一个子集,我会理解这种行为,但在这里我选择了所有字段,所以这应该不是EntityDataSource转换的问题。
谢谢!
您可以在这里看到Linq对实体与ESQL的性能,看起来EntityDataSource使用ESQL来组成查询。然后当你使用"选择"属性时,它会改变投影,你就不能再使用模型实体了。
你可以做的是使用QueryCreated事件,并在执行查询之前通过更改它来过滤前1000条记录。这里有一个例子http://msdn.microsoft.com/en-us/library/ee404748.aspx