Vb.net “具体化”;友好的;来自断开连接的EF5上下文的实体
我有一个应用程序使用Entity Framework 5 Database First、VB.net、Linq、SQL Server 2008 R2和断开连接的存储库模式 我已经使用EF5.x dbContext生成器创建了我的POCO,并修改了T4模板以添加各种额外的位和BOB,包括我的INotifiyPropertyChanged事件引发 我有各种链接表,我需要以“友好”的方式显示数据 例如,我有以下两个表: 颜色:Vb.net “具体化”;友好的;来自断开连接的EF5上下文的实体,vb.net,linq,entity-framework,sql-server-2008-r2,Vb.net,Linq,Entity Framework,Sql Server 2008 R2,我有一个应用程序使用Entity Framework 5 Database First、VB.net、Linq、SQL Server 2008 R2和断开连接的存储库模式 我已经使用EF5.x dbContext生成器创建了我的POCO,并修改了T4模板以添加各种额外的位和BOB,包括我的INotifiyPropertyChanged事件引发 我有各种链接表,我需要以“友好”的方式显示数据 例如,我有以下两个表: 颜色: Colour_ID | Colour_Name | Crea
Colour_ID | Colour_Name | Created_By | Creation_Date | Modified_By | Modification_Date
----------------------------------------------------------------------------------------------
1 | Blue | 1 | 22-01-13 | 1 | 23-01-13
User_ID | First_Name | Last_Name |
--------------------------------------
1 | Peter | Gallagher |
用户:
Colour_ID | Colour_Name | Created_By | Creation_Date | Modified_By | Modification_Date
----------------------------------------------------------------------------------------------
1 | Blue | 1 | 22-01-13 | 1 | 23-01-13
User_ID | First_Name | Last_Name |
--------------------------------------
1 | Peter | Gallagher |
为了在我的数据网格中显示“友好的数据”,我拉入数据,并使用如下代码创建“友好的实体”
将CriticalPathDBContext用作CriticalPathEntities=ConnectToDatabase()
Dim查询=(来自CriticalPathDBContext.colors中的颜色_
.包括(功能(x)x.CreationUser)_
.Include(函数(x)x.LastUpdateUser).AsNoTracking.ToList
使用{.CreatedBy=If(color.CreationUserCode为Nothing,“”,color.CreationUser.First_Name&&&color.CreationUser.Last_Name)选择新的FriendlyColor,
.CreationDate=颜色.CreationDate,
.CreationUserCode=颜色.CreationUserCode,
.LastUpdateDate=颜色.LastUpdateDate,
.LastUpdatedBy=If(color.LastUpdateUserCode为Nothing,“,color.LastUpdateUser.First\u Name&&&color.LastUpdateUser.Last\u Name),
.LastUpdateUserCode=color.LastUpdateUserCode,
.color\u ID=color.color\u ID,
.color\u Name=color.color\u Name}).OrderBy(函数(x)x.color\u Name)
返回新的ObservableCollection(FriendlyColor)(查询)
终端使用
我上面提到的问题是,对于更复杂的连接实体,这种类型的查询花费的时间太长
我已经考虑过使用我的好友类来拉入相关数据,但是在断开连接的模式中,这对我不起作用
显然,在断开连接时,延迟加载不是一个选项
所以,我的问题是。。。有更好的方法吗?为了更好。。。读得快一点
任何帮助都将受到感激!也许我错过了一些明显的东西
编辑…以进一步解释:
Colour_ID | Colour_Name | Created_By | Creation_Date | Modified_By | Modification_Date
----------------------------------------------------------------------------------------------
1 | Blue | 1 | 22-01-13 | 1 | 23-01-13
User_ID | First_Name | Last_Name |
--------------------------------------
1 | Peter | Gallagher |
- 我有一个查询,返回所有产品及其 组件和产品库存项目
- 返回的组件列表有4种不同的类型,如下所示 以及产品库存项目列表
- 我把每一套组件和产品库存项目,并填写一份 与结果关联的网格
- 用户可以从各种组件或产品库存项目中添加、编辑或删除项目
GetProductComponentsByPrimaryName
调用一个函数,该函数只按组件类型过滤组件,并返回一个友好的ObservableCollection
因此,每个相关的组件集和产品库存项都作为一个可观察集合返回,我可以与之交互
很抱歉发了这么长的帖子
编辑-08-03-13:
Colour_ID | Colour_Name | Created_By | Creation_Date | Modified_By | Modification_Date
----------------------------------------------------------------------------------------------
1 | Blue | 1 | 22-01-13 | 1 | 23-01-13
User_ID | First_Name | Last_Name |
--------------------------------------
1 | Peter | Gallagher |
我没有解决上面的这个问题,但我已经设法说服客户机,他们不应该检索所有的结果,然后依赖用户进行过滤
这也使我重新调整了过滤例程,以便在数据库上而不是本地执行过滤。
这两个因素都意味着下面的查询现在以合理的速度运行
我尝试手动填充实体,但这比Linq为我生成的查询花费的时间要长得多
也许有一天我会重新审视这个问题,看看我能学到什么。但现在,我已经避开了它 创建一个执行相同查询的存储过程,并将结果作为新实体类型或FriendlyColor(如果可以)返回。你是对的,像这样做是一件坏事。不确定我还可以添加什么。该查询将通过网络产生大量数据。您可能应该从投影到只包含所需数据的实体开始。根据您的数据需求,这可能不会有帮助 SQL通常在运行简单查询时非常快速,因此您可以尝试分别加载每个集合,然后在代码中将实体粘在一起。这将大大减少传输的数据量 下面是一个简单的例子来解释为什么这样加入会扼杀你的表现: 在我的测试数据库中,我有三个数据非常少的表,但是您应该仍然可以看到模式 首先是单个查询
SELECT * FROM [OPath-dev].[dbo].[Groups] g
1;Hästhovarna;nzb5x50vibb;0;NULL;NULL;0
SELECT *
FROM [OPath-dev].[dbo].[Groups] g
JOIN [OPath-dev].[dbo].[GroupMemberships] gm on gm.GroupId = g.Id
1;Hästhovarna;nzb5x50vibb;0;NULL;NULL;0;1;1;1
1;Hästhovarna;nzb5x50vibb;0;NULL;NULL;0;2;1;0
一排。记事本上有39个字符++
SELECT * FROM [OPath-dev].[dbo].[GroupMemberships]
1;1;1
2;1;0
两排。12个字符
SELECT * FROM [OPath-dev].[dbo].[Blogs] where id > 5
带字段的3行
- 头衔李>
- 介绍李>
- 身体李>
- 出版日期李>
- 创造李>
- 创作者李>
- 创造者李>
- 编辑李>
- 编辑李>
- 社论
SELECT * FROM [OPath-dev].[dbo].[Blogs] where id > 5
连接两个简单的表
SELECT * FROM [OPath-dev].[dbo].[Groups] g
1;Hästhovarna;nzb5x50vibb;0;NULL;NULL;0
SELECT *
FROM [OPath-dev].[dbo].[Groups] g
JOIN [OPath-dev].[dbo].[GroupMemberships] gm on gm.GroupId = g.Id
1;Hästhovarna;nzb5x50vibb;0;NULL;NULL;0;1;1;1
1;Hästhovarna;nzb5x50vibb;0;NULL;NULL;0;2;1;0
长度现在是96个字符。如果在单独的查询中运行这两个函数,它将是39+12=51(这可能会更快,因为差异很小)
连接所有三个表
SELECT *
FROM [OPath-dev].[dbo].[Groups] g
JOIN [OPath-dev].[dbo].[GroupMemberships] gm on gm.GroupId = g.Id
JOIN [OPath-dev].[dbo].[Blogs] b on b.Id > 5
响应为6行,包含以下列:
- 身份证李>
- 姓名李>
- 联合编码李>
- 我是竞赛俱乐部李>
- SourceSystemKey\u SystemKey李>
- SourceSystemKey\u EntityId李>
- SourceSystemKey\u HasValue李>
- 用户标识李>
- GroupId李>
- 行政长官
- 身份证李>
- 头衔李>
-