我正在测试 Web 窗体的新 ASP.NET 4.5 模型绑定,其中包含一个公开 IQueryable 的简单存储库。存储库使用 EF 5,数据库优先方法。我正在投影 EF 自动生成的实体以使用我的 DTO。
一切正常,这就是重点,我期待看到某种异常......
这是代码:
存储库
public IQueryable<JobDto> GetJobs()
{
var ctx = this.contextResolver.GetCurrentContext<pubsEntities>();
return ctx.jobs.Select(x => new JobDto
{
Description = x.job_desc,
ID = x.job_id,
Maximum = x.max_lvl,
Minimum = x.min_lvl
});
}
如您所见,我将我的 EF 实体投影到自定义 DTO 中,并且属性完全不同。
ASPX 代码背后
public IQueryable<JobDto> gv_GetData()
{
return this.jobsRepository.GetJobs();
}
ASPX
<asp:GridView runat="server" ID="gv" AllowPaging="true" AllowSorting="true"
DataKeyNames="ID"
AutoGenerateColumns="true"
SelectMethod="gv_GetData"
ItemType="QueryRepository.JobDto, QueryRepository">
<Columns>
<asp:BoundField DataField="Description" HeaderText="My custom description" SortExpression="Description" />
</Columns>
</asp:GridView>
当使用很棒的存储库时,这就像一个魅力,开箱即用的分页和排序(现在我不必使用 anObjectDataSource
来简化分页和排序之类的事情)
我的问题是:
如果我的存储库正在返回IQueryable<JobDto>
,并且我的 DTO 的属性与我的 EF 实体的属性(它是一个名为: 的不同实体job
)的属性不同。
GridView
既然我GridView
配置了我的 DTO 实体中定义的属性名称,EF 怎么可能正确地对我进行排序???据我所知,使用 LINQ 的动态排序是使用字符串来设置顺序标准的。不知何故 LINQ to Entities -IQueryable
将我的 DTO 属性自动映射到我的 EF 实体公开的属性。
谁能帮助这个可怜的灵魂=(了解幕后发生的事情??
我运行 SQL 配置文件只是为了确认查询在数据库中正确执行:
SELECT TOP (10)
[Project1].[C1] AS [C1],
[Project1].[job_desc] AS [job_desc],
[Project1].[job_id] AS [job_id],
[Project1].[max_lvl] AS [max_lvl],
[Project1].[min_lvl] AS [min_lvl]
FROM ( SELECT [Project1].[job_id] AS [job_id], [Project1].[job_desc] AS [job_desc], [Project1].[min_lvl] AS [min_lvl], [Project1].[max_lvl] AS [max_lvl], [Project1].[C1] AS [C1], row_number() OVER (ORDER BY [Project1].[job_desc] DESC) AS [row_number]
FROM ( SELECT
[Extent1].[job_id] AS [job_id],
[Extent1].[job_desc] AS [job_desc],
[Extent1].[min_lvl] AS [min_lvl],
[Extent1].[max_lvl] AS [max_lvl],
1 AS [C1]
FROM [dbo].[jobs] AS [Extent1]
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 0
ORDER BY [Project1].[job_desc] DESC
请特别注意这些行 (ASPX):
<asp:BoundField DataField="Description" SortExpression="Description" />
以及生成的 SQL
ORDER BY [Project1].[job_desc] DESC