IQueryableを公開する単純なリポジトリを使用して、Webフォーム用の新しいASP.NET4.5モデルバインディングをテストしていました。リポジトリはEF5、データベースファーストアプローチを使用しています。DTOを使用するためにEF自動生成エンティティを投影しています。
すべてが正常に機能し、それがポイントです。ある種の例外が発生することを期待していました...
これはコードです:
リポジトリ
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>
これは、すばらしいリポジトリを使用するときに、魅力、ページング、および箱から出してObjectDataSource
ソートするように機能します(現在、ページングやソートなどを単純化するためにを使用する必要はありません)
私の質問は:
リポジトリが返さIQueryable<JobDto>
れ、DTOのプロパティの名前がEFエンティティ(:という名前の別のエンティティjob
)のプロパティと同じでない場合。
DTOエンティティで定義されたプロパティ名で構成されているので、 EFがGridView
正しくソートできるのはどうしてですか?GridView
私の知る限り、LINQを使用した動的ソートは、文字列を使用して順序基準を設定して行われます。どういうわけかLINQtoEntities 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