Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net “具体化”;友好的;来自断开连接的EF5上下文的实体_Vb.net_Linq_Entity Framework_Sql Server 2008 R2 - Fatal编程技术网

Vb.net “具体化”;友好的;来自断开连接的EF5上下文的实体

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

我有一个应用程序使用Entity Framework 5 Database First、VB.net、Linq、SQL Server 2008 R2和断开连接的存储库模式

我已经使用EF5.x dbContext生成器创建了我的POCO,并修改了T4模板以添加各种额外的位和BOB,包括我的INotifiyPropertyChanged事件引发

我有各种链接表,我需要以“友好”的方式显示数据

例如,我有以下两个表:

颜色:

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行

  • 头衔
  • 介绍
  • 身体
  • 出版日期
  • 创造
  • 创作者
  • 创造者
  • 编辑
  • 编辑
  • 社论
5907个字符

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行,包含以下列: