0

我正在使用 EntityDataSource。当我将“选择”属性留空时,一切正常 - 在 SomeWebControl_DataBinding 中,我可以完美地将 GridRow 的 DataItem 转换为我的实体(我们称之为用户)。

Literal ctrlTime = (Literal)sender;
GridViewRow row = (GridViewRow)ctrlTime.NamingContainer;
USERS usersRow = (USERS)row.DataItem;
DateTime timestamp = usersRow.Time;

但是,我只需要显示表的第 1 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 转换来说应该不是问题。

谢谢!

4

1 回答 1

0

正如您在此处看到的 Linq to Entities 与 ESQL 的性能,似乎 EntityDataSource 使用 ESQL 来编写查询。然后,当您使用“选择”属性时,它会更改投影并且您不能再使用模型实体。

您可以做的是使用 QueryCreated 事件并在执行查询之前通过更改它来过滤前 1000 条记录。这里有一个例子http://msdn.microsoft.com/en-us/library/ee404748.aspx

于 2014-04-24T18:37:44.750 回答