- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试用于 Web 窗体的新 ASP.NET 4.5 模型绑定(bind),使用一个简单的存储库公开 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 中,并且属性完全不同。
public IQueryable<JobDto> gv_GetData()
{
return this.jobsRepository.GetJobs();
}
<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
的不同实体)的属性同名。
EF 怎么可能对我的 GridView
进行排序?正确自从我的GridView
配置了我的 DTO 实体中定义的属性名称???据我所知,使用 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
最佳答案
使用这段代码:
return ctx.jobs.Select(x => new JobDto
{
Description = x.job_desc,
ID = x.job_id,
Maximum = x.max_lvl,
Minimum = x.min_lvl
});
Select
您正在调用的重载实际上是在创建一个新的 IQueryable
这会影响 EF 发出的实际 SQL。您还没有真正将数据对象投影到您的 DTO,而是给 EF 一个表达式,它可以用来为结果集创建查询,一旦查询运行,该结果集稍后将投影到您的 DTO。请注意,在 Select
被调用的重载,一个 Expression<Func<Job, JobDto>>
正在通过,而不仅仅是 Func<Job, JobDto>
.因为 EF 分析表达式,所以它能够在可能的情况下对 SQL 进行复杂的转换。
当 OrderBy
表达式由您的 GridView
添加, 它也只是在修改你的 IQueryable
使用可以转换为 SQL 的新表达式。
编辑:
当您调用 Select
时在 IQueryable<Job> jobs
上您的上下文属性,EF 能够查看您的 Expression<Job, JobDto>
并确定:
JobDto
需要哪些列投影JobDto
投影由 Job
填充表。如果你看一下很多Expression
BCL 中的类(class),你会看到它是如何做到这一点的。编译器,遇到x => new JobDto { Description = x.job_desc, ... }
时, 创建一个看起来像这样的复杂表达式树(我正在严格简化它):
LambdaExpression<Func<Job, JobDto>>
MemberInitExpression
NewExpression
Bindings
MemberAssignment
Member = Description property
Expression = MemberExpression representing access to the Job property
MemberAssignment...
MemberAssignment...
MemberAssignment...
etc.
您可以看到此树如何包含足够的信息供 EF 遍历表达式并生成内部映射并生成等效的 SQL 命令。他们基本上是将 .NET 表达式投影到 SQL 表达式。并非所有内容都具有 1:1 映射,但在您的情况下,您可以看到映射是多么简单:
Job type -> Extent1 alias -> dbo.jobs table
JobDto projection -> Project1 alias -> subquery
您会注意到还有其他投影;它引入了一个行号属性和一些包含值 1
的神秘属性;我不确定它的用途。
OrderBy
然后是一个额外的扩充,其中 Expression
进行了分析。
关于c# - IQueryable 和模型绑定(bind)魔术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12792166/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!